|
@@ -164,7 +164,8 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
final @Nullable TimeValue readTimeout,
|
|
|
final @Nullable Boolean disableChunkedEncoding,
|
|
|
final @Nullable ByteSizeValue bufferSize,
|
|
|
- final @Nullable Integer maxBulkDeletes
|
|
|
+ final @Nullable Integer maxBulkDeletes,
|
|
|
+ final @Nullable BlobPath blobContainerPath
|
|
|
) {
|
|
|
final Settings.Builder clientSettings = Settings.builder();
|
|
|
final String clientName = randomAlphaOfLength(5).toLowerCase(Locale.ROOT);
|
|
@@ -216,7 +217,10 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
new S3RepositoriesMetrics(new RepositoriesMetrics(recordingMeterRegistry)),
|
|
|
BackoffPolicy.constantBackoff(TimeValue.timeValueMillis(1), MAX_NUMBER_SNAPSHOT_DELETE_RETRIES)
|
|
|
);
|
|
|
- return new S3BlobContainer(randomBoolean() ? BlobPath.EMPTY : BlobPath.EMPTY.add("foo"), s3BlobStore) {
|
|
|
+ return new S3BlobContainer(
|
|
|
+ Objects.requireNonNullElse(blobContainerPath, randomBoolean() ? BlobPath.EMPTY : BlobPath.EMPTY.add("foo")),
|
|
|
+ s3BlobStore
|
|
|
+ ) {
|
|
|
@Override
|
|
|
public InputStream readBlob(OperationPurpose purpose, String blobName) throws IOException {
|
|
|
return new AssertingInputStream(new S3RetryingInputStream(purpose, s3BlobStore, buildKey(blobName)) {
|
|
@@ -261,7 +265,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
final int maxRetries = randomInt(5);
|
|
|
final CountDown countDown = new CountDown(maxRetries + 1);
|
|
|
|
|
|
- final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null, null);
|
|
|
|
|
|
final byte[] bytes = randomBlobContent();
|
|
|
httpServer.createContext(downloadStorageEndpoint(blobContainer, "write_blob_max_retries"), exchange -> {
|
|
@@ -309,7 +313,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
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);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, null, null);
|
|
|
|
|
|
// HTTP server does not send a response
|
|
|
httpServer.createContext(downloadStorageEndpoint(blobContainer, "write_blob_timeout"), exchange -> {
|
|
@@ -343,7 +347,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
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, bufferSize, null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(null, readTimeout, true, bufferSize, null, null);
|
|
|
|
|
|
final int parts = randomIntBetween(1, 5);
|
|
|
final long lastPartSize = randomLongBetween(10, 512);
|
|
@@ -439,7 +443,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
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, bufferSize, null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(null, readTimeout, true, bufferSize, null, null);
|
|
|
|
|
|
final int parts = randomIntBetween(1, 5);
|
|
|
final long lastPartSize = randomLongBetween(10, 512);
|
|
@@ -548,7 +552,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
0,
|
|
|
randomFrom(1000, Math.toIntExact(S3Repository.BUFFER_SIZE_SETTING.get(Settings.EMPTY).getBytes()))
|
|
|
);
|
|
|
- final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, ByteSizeValue.ofBytes(bufferSizeBytes), null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, ByteSizeValue.ofBytes(bufferSizeBytes), null, null);
|
|
|
final int meaningfulProgressBytes = Math.max(1, bufferSizeBytes / 100);
|
|
|
|
|
|
final byte[] bytes = randomBlobContent();
|
|
@@ -621,7 +625,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
0,
|
|
|
randomFrom(1000, Math.toIntExact(S3Repository.BUFFER_SIZE_SETTING.get(Settings.EMPTY).getBytes()))
|
|
|
);
|
|
|
- final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, ByteSizeValue.ofBytes(bufferSizeBytes), null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, ByteSizeValue.ofBytes(bufferSizeBytes), null, null);
|
|
|
|
|
|
final byte[] bytes = randomBlobContent();
|
|
|
|
|
@@ -659,7 +663,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
0,
|
|
|
randomFrom(1000, Math.toIntExact(S3Repository.BUFFER_SIZE_SETTING.get(Settings.EMPTY).getBytes()))
|
|
|
);
|
|
|
- final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, ByteSizeValue.ofBytes(bufferSizeBytes), null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, ByteSizeValue.ofBytes(bufferSizeBytes), null, null);
|
|
|
final int meaningfulProgressBytes = Math.max(1, bufferSizeBytes / 100);
|
|
|
|
|
|
final byte[] bytes = randomBlobContent(512);
|
|
@@ -752,7 +756,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
|
|
|
public void testDoesNotRetryOnNotFound() {
|
|
|
final int maxRetries = between(3, 5);
|
|
|
- final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(maxRetries, null, true, null, null, null);
|
|
|
|
|
|
final AtomicInteger numberOfReads = new AtomicInteger(0);
|
|
|
@SuppressForbidden(reason = "use a http server")
|
|
@@ -784,7 +788,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
|
|
|
public void testSnapshotDeletesRetryOnThrottlingError() throws IOException {
|
|
|
// disable AWS-client retries
|
|
|
- final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null);
|
|
|
|
|
|
int numBlobsToDelete = randomIntBetween(500, 3000);
|
|
|
List<String> blobsToDelete = new ArrayList<>();
|
|
@@ -804,7 +808,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
|
|
|
public void testSnapshotDeletesAbortRetriesWhenThreadIsInterrupted() {
|
|
|
// disable AWS-client retries
|
|
|
- final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null);
|
|
|
|
|
|
int numBlobsToDelete = randomIntBetween(500, 3000);
|
|
|
List<String> blobsToDelete = new ArrayList<>();
|
|
@@ -841,7 +845,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
|
|
|
public void testNonSnapshotDeletesAreNotRetried() {
|
|
|
// disable AWS-client retries
|
|
|
- final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null);
|
|
|
|
|
|
int numBlobsToDelete = randomIntBetween(500, 3000);
|
|
|
List<String> blobsToDelete = new ArrayList<>();
|
|
@@ -870,7 +874,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
|
|
|
public void testNonThrottlingErrorsAreNotRetried() {
|
|
|
// disable AWS-client retries
|
|
|
- final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(0, null, true, null, null, null);
|
|
|
|
|
|
int numBlobsToDelete = randomIntBetween(500, 3000);
|
|
|
List<String> blobsToDelete = new ArrayList<>();
|
|
@@ -949,7 +953,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
|
|
|
public void testGetRegisterRetries() {
|
|
|
final var maxRetries = between(0, 3);
|
|
|
- final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(maxRetries, null, null, null, null, null);
|
|
|
|
|
|
interface FailingHandlerFactory {
|
|
|
void addHandler(String blobName, Integer... responseCodes);
|
|
@@ -1019,7 +1023,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
public void testSuppressedDeletionErrorsAreCapped() {
|
|
|
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
|
|
|
int maxBulkDeleteSize = randomIntBetween(1, 10);
|
|
|
- final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, maxBulkDeleteSize);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, maxBulkDeleteSize, null);
|
|
|
httpServer.createContext("/", exchange -> {
|
|
|
if (isMultiDeleteRequest(exchange)) {
|
|
|
exchange.sendResponseHeaders(
|
|
@@ -1051,7 +1055,7 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
|
|
|
public void testTrimmedLogAndCappedSuppressedErrorOnMultiObjectDeletionException() {
|
|
|
final TimeValue readTimeout = TimeValue.timeValueMillis(randomIntBetween(100, 500));
|
|
|
int maxBulkDeleteSize = randomIntBetween(10, 30);
|
|
|
- final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, maxBulkDeleteSize);
|
|
|
+ final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, maxBulkDeleteSize, null);
|
|
|
|
|
|
final Pattern pattern = Pattern.compile("<Key>(.+?)</Key>");
|
|
|
httpServer.createContext("/", exchange -> {
|