Skip to content

Commit c860a8a

Browse files
committed
Reinstate DnsResolver failure testing
1 parent 006b1de commit c860a8a

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed

modules/repository-s3/src/main/java/org/elasticsearch/repositories/s3/S3Service.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import software.amazon.awssdk.utils.SdkAutoCloseable;
3434

3535
import org.apache.http.client.utils.URIBuilder;
36+
import org.apache.http.conn.DnsResolver;
3637
import org.apache.logging.log4j.LogManager;
3738
import org.apache.logging.log4j.Logger;
3839
import org.elasticsearch.ElasticsearchException;
@@ -43,6 +44,7 @@
4344
import org.elasticsearch.common.settings.Setting;
4445
import org.elasticsearch.common.settings.Settings;
4546
import org.elasticsearch.common.util.Maps;
47+
import org.elasticsearch.core.Nullable;
4648
import org.elasticsearch.core.Releasable;
4749
import org.elasticsearch.core.Releasables;
4850
import org.elasticsearch.core.TimeValue;
@@ -157,7 +159,7 @@ public AmazonS3Reference client(RepositoryMetadata repositoryMetadata) {
157159
return existing;
158160
}
159161
// TODO NOMERGE: consider alternative methods of retaining an httpClient reference for an explicit close() call.
160-
SdkHttpClient httpClient = buildHttpClient(clientSettings);
162+
SdkHttpClient httpClient = buildHttpClient(clientSettings, getCustomDnsResolver());
161163
Releasable toRelease = httpClient::close;
162164
try {
163165
final AmazonS3Reference clientReference = new AmazonS3Reference(buildClient(clientSettings, httpClient), httpClient);
@@ -240,13 +242,23 @@ protected S3ClientBuilder buildClientBuilder(S3ClientSettings clientSettings, Sd
240242
return s3clientBuilder;
241243
}
242244

243-
static SdkHttpClient buildHttpClient(S3ClientSettings clientSettings) {
245+
@Nullable // in production, but exposed for tests to override
246+
DnsResolver getCustomDnsResolver() {
247+
return null;
248+
}
249+
250+
static SdkHttpClient buildHttpClient(S3ClientSettings clientSettings, @Nullable /* to use default resolver */ DnsResolver dnsResolver) {
244251
ApacheHttpClient.Builder httpClientBuilder = ApacheHttpClient.builder();
245252

246253
httpClientBuilder.maxConnections(clientSettings.maxConnections);
247254
httpClientBuilder.socketTimeout(Duration.ofMillis(clientSettings.readTimeoutMillis));
248255

249256
applyProxyConfiguration(clientSettings, httpClientBuilder);
257+
258+
if (dnsResolver != null) {
259+
httpClientBuilder.dnsResolver(dnsResolver);
260+
}
261+
250262
return httpClientBuilder.build();
251263
}
252264

modules/repository-s3/src/test/java/org/elasticsearch/repositories/s3/AwsS3ServiceImplTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ private void launchAWSConfigurationTest(
209209
) {
210210

211211
final S3ClientSettings clientSettings = S3ClientSettings.getClientSettings(settings, "default");
212-
final var httpClient = S3Service.buildHttpClient(clientSettings);
212+
final var httpClient = S3Service.buildHttpClient(clientSettings, null);
213213
final ClientOverrideConfiguration configuration = S3Service.buildConfiguration(clientSettings, false);
214214

215215
// TODO NOMERGE

modules/repository-s3/src/test/java/org/elasticsearch/repositories/s3/S3BlobContainerRetriesTests.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.sun.net.httpserver.HttpHandler;
1818

1919
import org.apache.http.HttpStatus;
20+
import org.apache.http.conn.DnsResolver;
2021
import org.apache.logging.log4j.Level;
2122
import org.elasticsearch.ExceptionsHelper;
2223
import org.elasticsearch.cluster.metadata.RepositoryMetadata;
@@ -66,8 +67,10 @@
6667
import java.io.IOException;
6768
import java.io.InputStream;
6869
import java.io.InputStreamReader;
70+
import java.net.InetAddress;
6971
import java.net.InetSocketAddress;
7072
import java.net.SocketTimeoutException;
73+
import java.net.UnknownHostException;
7174
import java.nio.charset.StandardCharsets;
7275
import java.nio.file.NoSuchFileException;
7376
import java.security.MessageDigest;
@@ -112,12 +115,26 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
112115

113116
private static final int MAX_NUMBER_SNAPSHOT_DELETE_RETRIES = 10;
114117
private S3Service service;
115-
// private AtomicBoolean shouldErrorOnDns; // TODO NOMERGE do we need to cover this too?
118+
private volatile boolean shouldErrorOnDns;
116119
private RecordingMeterRegistry recordingMeterRegistry;
117120

118121
@Before
119122
public void setUp() throws Exception {
120-
service = new S3Service(Mockito.mock(Environment.class), Settings.EMPTY, Mockito.mock(ResourceWatcherService.class));
123+
shouldErrorOnDns = false;
124+
service = new S3Service(Mockito.mock(Environment.class), Settings.EMPTY, Mockito.mock(ResourceWatcherService.class)) {
125+
private InetAddress[] resolveHost(String host) throws UnknownHostException {
126+
assertEquals("127.0.0.1", host);
127+
if (shouldErrorOnDns && randomBoolean() && randomBoolean()) {
128+
throw new UnknownHostException(host);
129+
}
130+
return new InetAddress[] { InetAddress.getLoopbackAddress() };
131+
}
132+
133+
@Override
134+
DnsResolver getCustomDnsResolver() {
135+
return this::resolveHost;
136+
}
137+
};
121138
recordingMeterRegistry = new RecordingMeterRegistry();
122139
super.setUp();
123140
}
@@ -658,7 +675,7 @@ public void testReadWithIndicesPurposeRetriesForever() throws IOException {
658675

659676
final byte[] bytes = randomBlobContent(512);
660677

661-
// shouldErrorOnDns.set(true); // TODO NOMERGE do we need to cover this too?
678+
shouldErrorOnDns = true;
662679
final AtomicInteger failures = new AtomicInteger();
663680
@SuppressForbidden(reason = "use a http server")
664681
class FlakyReadHandler implements HttpHandler {

0 commit comments

Comments
 (0)