diff --git a/plugins/repository-azure/src/internalClusterTest/java/org/opensearch/repositories/azure/AzureBlobStoreRepositoryTests.java b/plugins/repository-azure/src/internalClusterTest/java/org/opensearch/repositories/azure/AzureBlobStoreRepositoryTests.java index 1ba16422c9214..85439f131f63f 100644 --- a/plugins/repository-azure/src/internalClusterTest/java/org/opensearch/repositories/azure/AzureBlobStoreRepositoryTests.java +++ b/plugins/repository-azure/src/internalClusterTest/java/org/opensearch/repositories/azure/AzureBlobStoreRepositoryTests.java @@ -95,7 +95,7 @@ protected Map createHttpHandlers() { @Override protected HttpHandler createErroneousHttpHandler(final HttpHandler delegate) { - return new AzureErroneousHttpHandler(delegate, randomIntBetween(2, 3)); + return new AzureErroneousHttpHandler(delegate, randomDoubleBetween(0, 0.25, false)); } @Override @@ -163,8 +163,8 @@ private static class AzureBlobStoreHttpHandler extends AzureHttpHandler implemen @SuppressForbidden(reason = "this test uses a HttpServer to emulate an Azure endpoint") private static class AzureErroneousHttpHandler extends ErroneousHttpHandler { - AzureErroneousHttpHandler(final HttpHandler delegate, final int maxErrorsPerRequest) { - super(delegate, maxErrorsPerRequest); + AzureErroneousHttpHandler(final HttpHandler delegate, final double maxErrorsPercentage) { + super(delegate, maxErrorsPercentage); } @Override diff --git a/plugins/repository-gcs/src/internalClusterTest/java/org/opensearch/repositories/gcs/GoogleCloudStorageBlobStoreRepositoryTests.java b/plugins/repository-gcs/src/internalClusterTest/java/org/opensearch/repositories/gcs/GoogleCloudStorageBlobStoreRepositoryTests.java index d223f7989c688..e93d69a4f3cf2 100644 --- a/plugins/repository-gcs/src/internalClusterTest/java/org/opensearch/repositories/gcs/GoogleCloudStorageBlobStoreRepositoryTests.java +++ b/plugins/repository-gcs/src/internalClusterTest/java/org/opensearch/repositories/gcs/GoogleCloudStorageBlobStoreRepositoryTests.java @@ -112,7 +112,7 @@ protected Map createHttpHandlers() { @Override protected HttpHandler createErroneousHttpHandler(final HttpHandler delegate) { - return new GoogleErroneousHttpHandler(delegate, randomIntBetween(2, 3)); + return new GoogleErroneousHttpHandler(delegate, randomDoubleBetween(0, 0.25, false)); } @Override @@ -305,8 +305,8 @@ private static class GoogleCloudStorageBlobStoreHttpHandler extends GoogleCloudS @SuppressForbidden(reason = "this test uses a HttpServer to emulate a Google Cloud Storage endpoint") private static class GoogleErroneousHttpHandler extends ErroneousHttpHandler { - GoogleErroneousHttpHandler(final HttpHandler delegate, final int maxErrorsPerRequest) { - super(delegate, maxErrorsPerRequest); + GoogleErroneousHttpHandler(final HttpHandler delegate, final double maxErrorsPercentage) { + super(delegate, maxErrorsPercentage); } @Override diff --git a/plugins/repository-s3/src/internalClusterTest/java/org/opensearch/repositories/s3/S3BlobStoreRepositoryTests.java b/plugins/repository-s3/src/internalClusterTest/java/org/opensearch/repositories/s3/S3BlobStoreRepositoryTests.java index c4b47f3cc899f..bbdc91336927d 100644 --- a/plugins/repository-s3/src/internalClusterTest/java/org/opensearch/repositories/s3/S3BlobStoreRepositoryTests.java +++ b/plugins/repository-s3/src/internalClusterTest/java/org/opensearch/repositories/s3/S3BlobStoreRepositoryTests.java @@ -150,7 +150,7 @@ protected Map createHttpHandlers() { @Override protected HttpHandler createErroneousHttpHandler(final HttpHandler delegate) { - return new S3StatsCollectorHttpHandler(new S3ErroneousHttpHandler(delegate, randomIntBetween(2, 3))); + return new S3StatsCollectorHttpHandler(new S3ErroneousHttpHandler(delegate, randomDoubleBetween(0, 0.25, false))); } @Override @@ -395,8 +395,8 @@ private void validateAuthHeader(HttpExchange exchange) { @SuppressForbidden(reason = "this test uses a HttpServer to emulate an S3 endpoint") private static class S3ErroneousHttpHandler extends ErroneousHttpHandler { - S3ErroneousHttpHandler(final HttpHandler delegate, final int maxErrorsPerRequest) { - super(delegate, maxErrorsPerRequest); + S3ErroneousHttpHandler(final HttpHandler delegate, final double maxErrorsPercentage) { + super(delegate, maxErrorsPercentage); } @Override diff --git a/test/framework/src/main/java/org/opensearch/repositories/blobstore/OpenSearchMockAPIBasedRepositoryIntegTestCase.java b/test/framework/src/main/java/org/opensearch/repositories/blobstore/OpenSearchMockAPIBasedRepositoryIntegTestCase.java index 13972ec254ca7..7fb10f0c29e46 100644 --- a/test/framework/src/main/java/org/opensearch/repositories/blobstore/OpenSearchMockAPIBasedRepositoryIntegTestCase.java +++ b/test/framework/src/main/java/org/opensearch/repositories/blobstore/OpenSearchMockAPIBasedRepositoryIntegTestCase.java @@ -277,14 +277,15 @@ protected abstract static class ErroneousHttpHandler implements DelegatingHttpHa private final Map requests; private final HttpHandler delegate; - private final int maxErrorsPerRequest; + private final double maxErrorsPercentage; @SuppressForbidden(reason = "this test uses a HttpServer to emulate a cloud-based storage service") - protected ErroneousHttpHandler(final HttpHandler delegate, final int maxErrorsPerRequest) { + protected ErroneousHttpHandler(final HttpHandler delegate, final double maxErrorsPercentage) { this.requests = new ConcurrentHashMap<>(); this.delegate = delegate; - this.maxErrorsPerRequest = maxErrorsPerRequest; - assert maxErrorsPerRequest > 1; + this.maxErrorsPercentage = maxErrorsPercentage; + // We don't want to fail too often as it will cost too much time, which will lead to flaky tests + assert maxErrorsPercentage >= 0 && maxErrorsPercentage <= 0.25; } @Override @@ -295,7 +296,9 @@ public void handle(final HttpExchange exchange) throws IOException { final boolean canFailRequest = canFailRequest(exchange); final int count = requests.computeIfAbsent(requestId, req -> new AtomicInteger(0)).incrementAndGet(); - if (count >= maxErrorsPerRequest || canFailRequest == false) { + // We should not fail more than 3 times as the default max retry count is 3 (see SdkDefaultRetrySetting.maxAttempts), the + // request will fail when retry count > 3. + if (random().nextDouble() > maxErrorsPercentage || count >= 3 || canFailRequest == false) { requests.remove(requestId); delegate.handle(exchange); } else {