Skip to content

Commit 4b2867a

Browse files
Support maxConnections override in AbstractBlobContainerRetriesTestCase tests (#126435)
1 parent 20f6a2a commit 4b2867a

File tree

4 files changed

+60
-28
lines changed

4 files changed

+60
-28
lines changed

modules/repository-gcs/src/test/java/org/elasticsearch/repositories/gcs/GoogleCloudStorageBlobContainerRetriesTests.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ protected BlobContainer createBlobContainer(
126126
final @Nullable Integer maxRetries,
127127
final @Nullable TimeValue readTimeout,
128128
final @Nullable Boolean disableChunkedEncoding,
129+
final @Nullable Integer maxConnections,
129130
final @Nullable ByteSizeValue bufferSize,
130131
final @Nullable Integer maxBulkDeletes,
131132
final @Nullable BlobPath blobContainerPath
@@ -228,7 +229,7 @@ public void testShouldRetryOnUnresolvableHost() {
228229

229230
private void executeListBlobsAndAssertRetries() {
230231
final int maxRetries = randomIntBetween(3, 5);
231-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null);
232+
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null, null);
232233
expectThrows(StorageException.class, () -> blobContainer.listBlobs(randomPurpose()));
233234
assertEquals(maxRetries + 1, requestCounters.get("/storage/v1/b/bucket/o").get());
234235
}
@@ -237,7 +238,7 @@ public void testReadLargeBlobWithRetries() throws Exception {
237238
final int maxRetries = randomIntBetween(2, 10);
238239
final AtomicInteger countDown = new AtomicInteger(maxRetries);
239240

240-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null);
241+
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null, null);
241242

242243
// SDK reads in 2 MB chunks so we use twice that to simulate 2 chunks
243244
final byte[] bytes = randomBytes(1 << 22);
@@ -266,7 +267,7 @@ public void testWriteBlobWithRetries() throws Exception {
266267
final int maxRetries = randomIntBetween(2, 10);
267268
final CountDown countDown = new CountDown(maxRetries);
268269

269-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null);
270+
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null, null);
270271
final byte[] bytes = randomBlobContent();
271272
httpServer.createContext("/upload/storage/v1/b/bucket/o", safeHandler(exchange -> {
272273
assertThat(exchange.getRequestURI().getQuery(), containsString("uploadType=multipart"));
@@ -308,7 +309,7 @@ public void testWriteBlobWithRetries() throws Exception {
308309
public void testWriteBlobWithReadTimeouts() {
309310
final byte[] bytes = randomByteArrayOfLength(randomIntBetween(10, 128));
310311
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
311-
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, null, null, null, null);
312+
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, null, null, null, null, null);
312313

313314
// HTTP server does not send a response
314315
httpServer.createContext("/upload/storage/v1/b/bucket/o", exchange -> {
@@ -360,7 +361,7 @@ public void testWriteLargeBlob() throws IOException {
360361
logger.debug("starting with resumable upload id [{}]", sessionUploadId.get());
361362

362363
final TimeValue readTimeout = allowReadTimeout.get() ? TimeValue.timeValueSeconds(3) : null;
363-
final BlobContainer blobContainer = createBlobContainer(nbErrors + 1, readTimeout, null, null, null, null);
364+
final BlobContainer blobContainer = createBlobContainer(nbErrors + 1, readTimeout, null, null, null, null, null);
364365

365366
httpServer.createContext("/upload/storage/v1/b/bucket/o", safeHandler(exchange -> {
366367
final BytesReference requestBody = Streams.readFully(exchange.getRequestBody());
@@ -507,7 +508,7 @@ public String next() {
507508
return Integer.toString(totalDeletesSent++);
508509
}
509510
};
510-
final BlobContainer blobContainer = createBlobContainer(1, null, null, null, null, null);
511+
final BlobContainer blobContainer = createBlobContainer(1, null, null, null, null, null, null);
511512
httpServer.createContext("/batch/storage/v1", safeHandler(exchange -> {
512513
assert pendingDeletes.get() <= MAX_DELETES_PER_BATCH;
513514

@@ -543,7 +544,7 @@ public void testCompareAndExchangeWhenThrottled() throws IOException {
543544
httpServer.createContext("/", new ResponseInjectingHttpHandler(requestHandlers, new GoogleCloudStorageHttpHandler("bucket")));
544545

545546
final int maxRetries = randomIntBetween(1, 3);
546-
final BlobContainer container = createBlobContainer(maxRetries, null, null, null, null, null);
547+
final BlobContainer container = createBlobContainer(maxRetries, null, null, null, null, null, null);
547548
final byte[] data = randomBytes(randomIntBetween(1, BlobContainerUtils.MAX_REGISTER_CONTENT_LENGTH));
548549
final String key = randomIdentifier();
549550

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

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
import static org.elasticsearch.repositories.blobstore.BlobStoreTestUtil.randomPurpose;
9090
import static org.elasticsearch.repositories.s3.S3ClientSettings.DISABLE_CHUNKED_ENCODING;
9191
import static org.elasticsearch.repositories.s3.S3ClientSettings.ENDPOINT_SETTING;
92+
import static org.elasticsearch.repositories.s3.S3ClientSettings.MAX_CONNECTIONS_SETTING;
9293
import static org.elasticsearch.repositories.s3.S3ClientSettings.MAX_RETRIES_SETTING;
9394
import static org.elasticsearch.repositories.s3.S3ClientSettings.READ_TIMEOUT_SETTING;
9495
import static org.hamcrest.Matchers.allOf;
@@ -163,6 +164,7 @@ protected BlobContainer createBlobContainer(
163164
final @Nullable Integer maxRetries,
164165
final @Nullable TimeValue readTimeout,
165166
final @Nullable Boolean disableChunkedEncoding,
167+
final @Nullable Integer maxConnections,
166168
final @Nullable ByteSizeValue bufferSize,
167169
final @Nullable Integer maxBulkDeletes,
168170
final @Nullable BlobPath blobContainerPath
@@ -183,6 +185,9 @@ protected BlobContainer createBlobContainer(
183185
if (disableChunkedEncoding != null) {
184186
clientSettings.put(DISABLE_CHUNKED_ENCODING.getConcreteSettingForNamespace(clientName).getKey(), disableChunkedEncoding);
185187
}
188+
if (maxConnections != null) {
189+
clientSettings.put(MAX_CONNECTIONS_SETTING.getConcreteSettingForNamespace(clientName).getKey(), maxConnections);
190+
}
186191

187192
final MockSecureSettings secureSettings = new MockSecureSettings();
188193
secureSettings.setString(
@@ -265,7 +270,7 @@ public void testWriteBlobWithRetries() throws Exception {
265270
final int maxRetries = randomInt(5);
266271
final CountDown countDown = new CountDown(maxRetries + 1);
267272

268-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null, null);
273+
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null, null, null);
269274

270275
final byte[] bytes = randomBlobContent();
271276
httpServer.createContext(downloadStorageEndpoint(blobContainer, "write_blob_max_retries"), exchange -> {
@@ -313,7 +318,7 @@ public void testWriteBlobWithRetries() throws Exception {
313318
public void testWriteBlobWithReadTimeouts() {
314319
final byte[] bytes = randomByteArrayOfLength(randomIntBetween(10, 128));
315320
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
316-
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, null, null);
321+
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, null, null, null);
317322

318323
// HTTP server does not send a response
319324
httpServer.createContext(downloadStorageEndpoint(blobContainer, "write_blob_timeout"), exchange -> {
@@ -347,7 +352,7 @@ public void testWriteLargeBlob() throws Exception {
347352
final boolean useTimeout = rarely();
348353
final TimeValue readTimeout = useTimeout ? TimeValue.timeValueMillis(randomIntBetween(100, 500)) : null;
349354
final ByteSizeValue bufferSize = ByteSizeValue.of(5, ByteSizeUnit.MB);
350-
final BlobContainer blobContainer = createBlobContainer(null, readTimeout, true, bufferSize, null, null);
355+
final BlobContainer blobContainer = createBlobContainer(null, readTimeout, true, null, bufferSize, null, null);
351356

352357
final int parts = randomIntBetween(1, 5);
353358
final long lastPartSize = randomLongBetween(10, 512);
@@ -443,7 +448,7 @@ public void testWriteLargeBlobStreaming() throws Exception {
443448
final boolean useTimeout = rarely();
444449
final TimeValue readTimeout = useTimeout ? TimeValue.timeValueMillis(randomIntBetween(100, 500)) : null;
445450
final ByteSizeValue bufferSize = ByteSizeValue.of(5, ByteSizeUnit.MB);
446-
final BlobContainer blobContainer = createBlobContainer(null, readTimeout, true, bufferSize, null, null);
451+
final BlobContainer blobContainer = createBlobContainer(null, readTimeout, true, null, bufferSize, null, null);
447452

448453
final int parts = randomIntBetween(1, 5);
449454
final long lastPartSize = randomLongBetween(10, 512);
@@ -552,7 +557,15 @@ public void testReadRetriesAfterMeaningfulProgress() throws Exception {
552557
0,
553558
randomFrom(1000, Math.toIntExact(S3Repository.BUFFER_SIZE_SETTING.get(Settings.EMPTY).getBytes()))
554559
);
555-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, ByteSizeValue.ofBytes(bufferSizeBytes), null, null);
560+
final BlobContainer blobContainer = createBlobContainer(
561+
maxRetries,
562+
null,
563+
true,
564+
null,
565+
ByteSizeValue.ofBytes(bufferSizeBytes),
566+
null,
567+
null
568+
);
556569
final int meaningfulProgressBytes = Math.max(1, bufferSizeBytes / 100);
557570

558571
final byte[] bytes = randomBlobContent();
@@ -625,7 +638,15 @@ public void testReadDoesNotRetryForRepositoryAnalysis() {
625638
0,
626639
randomFrom(1000, Math.toIntExact(S3Repository.BUFFER_SIZE_SETTING.get(Settings.EMPTY).getBytes()))
627640
);
628-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, ByteSizeValue.ofBytes(bufferSizeBytes), null, null);
641+
final BlobContainer blobContainer = createBlobContainer(
642+
maxRetries,
643+
null,
644+
true,
645+
null,
646+
ByteSizeValue.ofBytes(bufferSizeBytes),
647+
null,
648+
null
649+
);
629650

630651
final byte[] bytes = randomBlobContent();
631652

@@ -663,7 +684,15 @@ public void testReadWithIndicesPurposeRetriesForever() throws IOException {
663684
0,
664685
randomFrom(1000, Math.toIntExact(S3Repository.BUFFER_SIZE_SETTING.get(Settings.EMPTY).getBytes()))
665686
);
666-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, ByteSizeValue.ofBytes(bufferSizeBytes), null, null);
687+
final BlobContainer blobContainer = createBlobContainer(
688+
maxRetries,
689+
null,
690+
true,
691+
null,
692+
ByteSizeValue.ofBytes(bufferSizeBytes),
693+
null,
694+
null
695+
);
667696
final int meaningfulProgressBytes = Math.max(1, bufferSizeBytes / 100);
668697

669698
final byte[] bytes = randomBlobContent(512);
@@ -756,7 +785,7 @@ public void handle(HttpExchange exchange) throws IOException {
756785

757786
public void testDoesNotRetryOnNotFound() {
758787
final int maxRetries = between(3, 5);
759-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null, null);
788+
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null, null, null);
760789

761790
final AtomicInteger numberOfReads = new AtomicInteger(0);
762791
@SuppressForbidden(reason = "use a http server")
@@ -788,7 +817,7 @@ public void handle(HttpExchange exchange) throws IOException {
788817

789818
public void testSnapshotDeletesRetryOnThrottlingError() throws IOException {
790819
// disable AWS-client retries
791-
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null);
820+
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null, null);
792821

793822
int numBlobsToDelete = randomIntBetween(500, 3000);
794823
List<String> blobsToDelete = new ArrayList<>();
@@ -808,7 +837,7 @@ public void testSnapshotDeletesRetryOnThrottlingError() throws IOException {
808837

809838
public void testSnapshotDeletesAbortRetriesWhenThreadIsInterrupted() {
810839
// disable AWS-client retries
811-
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null);
840+
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null, null);
812841

813842
int numBlobsToDelete = randomIntBetween(500, 3000);
814843
List<String> blobsToDelete = new ArrayList<>();
@@ -845,7 +874,7 @@ public void testSnapshotDeletesAbortRetriesWhenThreadIsInterrupted() {
845874

846875
public void testNonSnapshotDeletesAreNotRetried() {
847876
// disable AWS-client retries
848-
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null);
877+
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null, null);
849878

850879
int numBlobsToDelete = randomIntBetween(500, 3000);
851880
List<String> blobsToDelete = new ArrayList<>();
@@ -874,7 +903,7 @@ public void testNonSnapshotDeletesAreNotRetried() {
874903

875904
public void testNonThrottlingErrorsAreNotRetried() {
876905
// disable AWS-client retries
877-
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null);
906+
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null, null);
878907

879908
int numBlobsToDelete = randomIntBetween(500, 3000);
880909
List<String> blobsToDelete = new ArrayList<>();
@@ -953,7 +982,7 @@ private Set<OperationPurpose> operationPurposesThatRetryOnDelete() {
953982

954983
public void testGetRegisterRetries() {
955984
final var maxRetries = between(0, 3);
956-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null);
985+
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null, null);
957986

958987
interface FailingHandlerFactory {
959988
void addHandler(String blobName, Integer... responseCodes);
@@ -1023,7 +1052,7 @@ interface FailingHandlerFactory {
10231052
public void testSuppressedDeletionErrorsAreCapped() {
10241053
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
10251054
int maxBulkDeleteSize = randomIntBetween(1, 10);
1026-
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, maxBulkDeleteSize, null);
1055+
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, null, maxBulkDeleteSize, null);
10271056
httpServer.createContext("/", exchange -> {
10281057
if (isMultiDeleteRequest(exchange)) {
10291058
exchange.sendResponseHeaders(
@@ -1055,7 +1084,7 @@ public void testSuppressedDeletionErrorsAreCapped() {
10551084
public void testTrimmedLogAndCappedSuppressedErrorOnMultiObjectDeletionException() {
10561085
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
10571086
int maxBulkDeleteSize = randomIntBetween(10, 30);
1058-
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, maxBulkDeleteSize, null);
1087+
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, null, maxBulkDeleteSize, null);
10591088

10601089
final Pattern pattern = Pattern.compile("<Key>(.+?)</Key>");
10611090
httpServer.createContext("/", exchange -> {

modules/repository-url/src/test/java/org/elasticsearch/common/blobstore/url/URLBlobContainerRetriesTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ protected BlobContainer createBlobContainer(
7777
Integer maxRetries,
7878
TimeValue readTimeout,
7979
Boolean disableChunkedEncoding,
80+
Integer maxConnections,
8081
ByteSizeValue bufferSize,
8182
Integer maxBulkDeletes,
8283
BlobPath blobContainerPath

test/framework/src/main/java/org/elasticsearch/repositories/blobstore/AbstractBlobContainerRetriesTestCase.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ protected abstract BlobContainer createBlobContainer(
8383
@Nullable Integer maxRetries,
8484
@Nullable TimeValue readTimeout,
8585
@Nullable Boolean disableChunkedEncoding,
86+
@Nullable Integer maxConnections,
8687
@Nullable ByteSizeValue bufferSize,
8788
@Nullable Integer maxBulkDeletes,
8889
@Nullable BlobPath blobContainerPath
@@ -94,7 +95,7 @@ protected org.hamcrest.Matcher<Object> readTimeoutExceptionMatcher() {
9495
}
9596

9697
public void testReadNonexistentBlobThrowsNoSuchFileException() {
97-
final BlobContainer blobContainer = createBlobContainer(between(1, 5), null, null, null, null, null);
98+
final BlobContainer blobContainer = createBlobContainer(between(1, 5), null, null, null, null, null, null);
9899
final long position = randomLongBetween(0, MAX_RANGE_VAL);
99100
final int length = randomIntBetween(1, Math.toIntExact(Math.min(Integer.MAX_VALUE, MAX_RANGE_VAL - position)));
100101
final Exception exception = expectThrows(NoSuchFileException.class, () -> {
@@ -121,7 +122,7 @@ public void testReadBlobWithRetries() throws Exception {
121122

122123
final byte[] bytes = randomBlobContent();
123124
final TimeValue readTimeout = TimeValue.timeValueSeconds(between(1, 3));
124-
final BlobContainer blobContainer = createBlobContainer(maxRetries, readTimeout, null, null, null, null);
125+
final BlobContainer blobContainer = createBlobContainer(maxRetries, readTimeout, null, null, null, null, null);
125126
httpServer.createContext(downloadStorageEndpoint(blobContainer, "read_blob_max_retries"), exchange -> {
126127
Streams.readFully(exchange.getRequestBody());
127128
if (countDown.countDown()) {
@@ -178,7 +179,7 @@ public void testReadRangeBlobWithRetries() throws Exception {
178179
final CountDown countDown = new CountDown(maxRetries + 1);
179180

180181
final TimeValue readTimeout = TimeValue.timeValueSeconds(between(5, 10));
181-
final BlobContainer blobContainer = createBlobContainer(maxRetries, readTimeout, null, null, null, null);
182+
final BlobContainer blobContainer = createBlobContainer(maxRetries, readTimeout, null, null, null, null, null);
182183
final byte[] bytes = randomBlobContent();
183184
httpServer.createContext(downloadStorageEndpoint(blobContainer, "read_range_blob_max_retries"), exchange -> {
184185
Streams.readFully(exchange.getRequestBody());
@@ -250,7 +251,7 @@ public void testReadRangeBlobWithRetries() throws Exception {
250251
public void testReadBlobWithReadTimeouts() {
251252
final int maxRetries = randomInt(5);
252253
final TimeValue readTimeout = TimeValue.timeValueMillis(between(100, 200));
253-
final BlobContainer blobContainer = createBlobContainer(maxRetries, readTimeout, null, null, null, null);
254+
final BlobContainer blobContainer = createBlobContainer(maxRetries, readTimeout, null, null, null, null, null);
254255

255256
// HTTP server does not send a response
256257
httpServer.createContext(downloadStorageEndpoint(blobContainer, "read_blob_unresponsive"), exchange -> {});
@@ -307,7 +308,7 @@ protected OperationPurpose randomFiniteRetryingPurpose() {
307308

308309
public void testReadBlobWithNoHttpResponse() {
309310
final TimeValue readTimeout = TimeValue.timeValueMillis(between(100, 200));
310-
final BlobContainer blobContainer = createBlobContainer(randomInt(5), readTimeout, null, null, null, null);
311+
final BlobContainer blobContainer = createBlobContainer(randomInt(5), readTimeout, null, null, null, null, null);
311312

312313
// HTTP server closes connection immediately
313314
httpServer.createContext(downloadStorageEndpoint(blobContainer, "read_blob_no_response"), HttpExchange::close);
@@ -327,7 +328,7 @@ public void testReadBlobWithNoHttpResponse() {
327328

328329
public void testReadBlobWithPrematureConnectionClose() {
329330
final int maxRetries = randomInt(20);
330-
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null);
331+
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null, null);
331332

332333
final boolean alwaysFlushBody = randomBoolean();
333334

0 commit comments

Comments
 (0)