Skip to content

Introduce TestBlobContainerBuilder #126445

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ public void testShouldRetryOnUnresolvableHost() {

private void executeListBlobsAndAssertRetries() {
final int maxRetries = randomIntBetween(3, 5);
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(maxRetries).build();
expectThrows(StorageException.class, () -> blobContainer.listBlobs(randomPurpose()));
assertEquals(maxRetries + 1, requestCounters.get("/storage/v1/b/bucket/o").get());
}
Expand All @@ -238,7 +238,7 @@ public void testReadLargeBlobWithRetries() throws Exception {
final int maxRetries = randomIntBetween(2, 10);
final AtomicInteger countDown = new AtomicInteger(maxRetries);

final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(maxRetries).build();

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

final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(maxRetries).build();
final byte[] bytes = randomBlobContent();
httpServer.createContext("/upload/storage/v1/b/bucket/o", safeHandler(exchange -> {
assertThat(exchange.getRequestURI().getQuery(), containsString("uploadType=multipart"));
Expand Down Expand Up @@ -309,7 +309,7 @@ public void testWriteBlobWithRetries() throws Exception {
public void testWriteBlobWithReadTimeouts() {
final byte[] bytes = randomByteArrayOfLength(randomIntBetween(10, 128));
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, null, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(1).readTimeout(readTimeout).build();

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

final TimeValue readTimeout = allowReadTimeout.get() ? TimeValue.timeValueSeconds(3) : null;
final BlobContainer blobContainer = createBlobContainer(nbErrors + 1, readTimeout, null, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(nbErrors + 1).readTimeout(readTimeout).build();

httpServer.createContext("/upload/storage/v1/b/bucket/o", safeHandler(exchange -> {
final BytesReference requestBody = Streams.readFully(exchange.getRequestBody());
Expand Down Expand Up @@ -508,7 +508,7 @@ public String next() {
return Integer.toString(totalDeletesSent++);
}
};
final BlobContainer blobContainer = createBlobContainer(1, null, null, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(1).build();
httpServer.createContext("/batch/storage/v1", safeHandler(exchange -> {
assert pendingDeletes.get() <= MAX_DELETES_PER_BATCH;

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

final int maxRetries = randomIntBetween(1, 3);
final BlobContainer container = createBlobContainer(maxRetries, null, null, null, null, null, null);
final BlobContainer container = blobContainerBuilder().maxRetries(maxRetries).build();
final byte[] data = randomBytes(randomIntBetween(1, BlobContainerUtils.MAX_REGISTER_CONTENT_LENGTH));
final String key = randomIdentifier();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ public void testWriteBlobWithRetries() throws Exception {
final int maxRetries = randomInt(5);
final CountDown countDown = new CountDown(maxRetries + 1);

final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(maxRetries).disableChunkedEncoding(true).build();

final byte[] bytes = randomBlobContent();
httpServer.createContext(downloadStorageEndpoint(blobContainer, "write_blob_max_retries"), exchange -> {
Expand Down Expand Up @@ -318,7 +318,10 @@ public void testWriteBlobWithRetries() throws Exception {
public void testWriteBlobWithReadTimeouts() {
final byte[] bytes = randomByteArrayOfLength(randomIntBetween(10, 128));
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(1)
.readTimeout(readTimeout)
.disableChunkedEncoding(true)
.build();

// HTTP server does not send a response
httpServer.createContext(downloadStorageEndpoint(blobContainer, "write_blob_timeout"), exchange -> {
Expand Down Expand Up @@ -352,7 +355,10 @@ public void testWriteLargeBlob() throws Exception {
final boolean useTimeout = rarely();
final TimeValue readTimeout = useTimeout ? TimeValue.timeValueMillis(randomIntBetween(100, 500)) : null;
final ByteSizeValue bufferSize = ByteSizeValue.of(5, ByteSizeUnit.MB);
final BlobContainer blobContainer = createBlobContainer(null, readTimeout, true, null, bufferSize, null, null);
final BlobContainer blobContainer = blobContainerBuilder().readTimeout(readTimeout)
.disableChunkedEncoding(true)
.bufferSize(bufferSize)
.build();

final int parts = randomIntBetween(1, 5);
final long lastPartSize = randomLongBetween(10, 512);
Expand Down Expand Up @@ -448,7 +454,10 @@ public void testWriteLargeBlobStreaming() throws Exception {
final boolean useTimeout = rarely();
final TimeValue readTimeout = useTimeout ? TimeValue.timeValueMillis(randomIntBetween(100, 500)) : null;
final ByteSizeValue bufferSize = ByteSizeValue.of(5, ByteSizeUnit.MB);
final BlobContainer blobContainer = createBlobContainer(null, readTimeout, true, null, bufferSize, null, null);
final BlobContainer blobContainer = blobContainerBuilder().readTimeout(readTimeout)
.disableChunkedEncoding(true)
.bufferSize(bufferSize)
.build();

final int parts = randomIntBetween(1, 5);
final long lastPartSize = randomLongBetween(10, 512);
Expand Down Expand Up @@ -557,15 +566,10 @@ public void testReadRetriesAfterMeaningfulProgress() throws Exception {
0,
randomFrom(1000, Math.toIntExact(S3Repository.BUFFER_SIZE_SETTING.get(Settings.EMPTY).getBytes()))
);
final BlobContainer blobContainer = createBlobContainer(
maxRetries,
null,
true,
null,
ByteSizeValue.ofBytes(bufferSizeBytes),
null,
null
);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(maxRetries)
.disableChunkedEncoding(true)
.bufferSize(ByteSizeValue.ofBytes(bufferSizeBytes))
.build();
final int meaningfulProgressBytes = Math.max(1, bufferSizeBytes / 100);

final byte[] bytes = randomBlobContent();
Expand Down Expand Up @@ -638,15 +642,10 @@ public void testReadDoesNotRetryForRepositoryAnalysis() {
0,
randomFrom(1000, Math.toIntExact(S3Repository.BUFFER_SIZE_SETTING.get(Settings.EMPTY).getBytes()))
);
final BlobContainer blobContainer = createBlobContainer(
maxRetries,
null,
true,
null,
ByteSizeValue.ofBytes(bufferSizeBytes),
null,
null
);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(maxRetries)
.disableChunkedEncoding(true)
.bufferSize(ByteSizeValue.ofBytes(bufferSizeBytes))
.build();

final byte[] bytes = randomBlobContent();

Expand Down Expand Up @@ -684,15 +683,10 @@ public void testReadWithIndicesPurposeRetriesForever() throws IOException {
0,
randomFrom(1000, Math.toIntExact(S3Repository.BUFFER_SIZE_SETTING.get(Settings.EMPTY).getBytes()))
);
final BlobContainer blobContainer = createBlobContainer(
maxRetries,
null,
true,
null,
ByteSizeValue.ofBytes(bufferSizeBytes),
null,
null
);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(maxRetries)
.disableChunkedEncoding(true)
.bufferSize(ByteSizeValue.ofBytes(bufferSizeBytes))
.build();
final int meaningfulProgressBytes = Math.max(1, bufferSizeBytes / 100);

final byte[] bytes = randomBlobContent(512);
Expand Down Expand Up @@ -785,7 +779,7 @@ public void handle(HttpExchange exchange) throws IOException {

public void testDoesNotRetryOnNotFound() {
final int maxRetries = between(3, 5);
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(maxRetries).disableChunkedEncoding(true).build();

final AtomicInteger numberOfReads = new AtomicInteger(0);
@SuppressForbidden(reason = "use a http server")
Expand Down Expand Up @@ -816,8 +810,11 @@ public void handle(HttpExchange exchange) throws IOException {
}

public void testSnapshotDeletesRetryOnThrottlingError() throws IOException {
// disable AWS-client retries
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder()
// disable AWS-client retries
.maxRetries(0)
.disableChunkedEncoding(true)
.build();

int numBlobsToDelete = randomIntBetween(500, 3000);
List<String> blobsToDelete = new ArrayList<>();
Expand All @@ -836,8 +833,11 @@ public void testSnapshotDeletesRetryOnThrottlingError() throws IOException {
}

public void testSnapshotDeletesAbortRetriesWhenThreadIsInterrupted() {
// disable AWS-client retries
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder()
// disable AWS-client retries
.maxRetries(0)
.disableChunkedEncoding(true)
.build();

int numBlobsToDelete = randomIntBetween(500, 3000);
List<String> blobsToDelete = new ArrayList<>();
Expand Down Expand Up @@ -873,8 +873,11 @@ public void testSnapshotDeletesAbortRetriesWhenThreadIsInterrupted() {
}

public void testNonSnapshotDeletesAreNotRetried() {
// disable AWS-client retries
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder()
// disable AWS-client retries
.maxRetries(0)
.disableChunkedEncoding(true)
.build();

int numBlobsToDelete = randomIntBetween(500, 3000);
List<String> blobsToDelete = new ArrayList<>();
Expand Down Expand Up @@ -902,8 +905,11 @@ public void testNonSnapshotDeletesAreNotRetried() {
}

public void testNonThrottlingErrorsAreNotRetried() {
// disable AWS-client retries
final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder()
// disable AWS-client retries
.maxRetries(0)
.disableChunkedEncoding(true)
.build();

int numBlobsToDelete = randomIntBetween(500, 3000);
List<String> blobsToDelete = new ArrayList<>();
Expand Down Expand Up @@ -982,7 +988,7 @@ private Set<OperationPurpose> operationPurposesThatRetryOnDelete() {

public void testGetRegisterRetries() {
final var maxRetries = between(0, 3);
final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(maxRetries).build();

interface FailingHandlerFactory {
void addHandler(String blobName, Integer... responseCodes);
Expand Down Expand Up @@ -1052,7 +1058,11 @@ interface FailingHandlerFactory {
public void testSuppressedDeletionErrorsAreCapped() {
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
int maxBulkDeleteSize = randomIntBetween(1, 10);
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, null, maxBulkDeleteSize, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(1)
.readTimeout(readTimeout)
.disableChunkedEncoding(true)
.maxBulkDeletes(maxBulkDeleteSize)
.build();
httpServer.createContext("/", exchange -> {
if (isMultiDeleteRequest(exchange)) {
exchange.sendResponseHeaders(
Expand Down Expand Up @@ -1084,7 +1094,11 @@ public void testSuppressedDeletionErrorsAreCapped() {
public void testTrimmedLogAndCappedSuppressedErrorOnMultiObjectDeletionException() {
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
int maxBulkDeleteSize = randomIntBetween(10, 30);
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, null, maxBulkDeleteSize, null);
final BlobContainer blobContainer = blobContainerBuilder().maxRetries(1)
.readTimeout(readTimeout)
.disableChunkedEncoding(true)
.maxBulkDeletes(maxBulkDeleteSize)
.build();

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