Skip to content

Commit 2500f35

Browse files
authored
Misc cleanups in S3BlobContainerRetriesTests (#126325)
- Simplify multi-object-delete request detection - Replace `AtomicBoolean` with volatile field Backport of #126101 to `8.x`
1 parent f9ef6a8 commit 2500f35

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373
import java.util.Map;
7474
import java.util.Objects;
7575
import java.util.OptionalInt;
76-
import java.util.concurrent.atomic.AtomicBoolean;
7776
import java.util.concurrent.atomic.AtomicInteger;
7877
import java.util.concurrent.atomic.AtomicLong;
7978
import java.util.regex.Pattern;
@@ -105,19 +104,19 @@
105104
public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTestCase {
106105

107106
private S3Service service;
108-
private AtomicBoolean shouldErrorOnDns;
107+
private volatile boolean shouldErrorOnDns;
109108
private RecordingMeterRegistry recordingMeterRegistry;
110109

111110
@Before
112111
public void setUp() throws Exception {
113-
shouldErrorOnDns = new AtomicBoolean(false);
112+
shouldErrorOnDns = false;
114113
service = new S3Service(Mockito.mock(Environment.class), Settings.EMPTY, Mockito.mock(ResourceWatcherService.class)) {
115114
@Override
116115
protected AmazonS3ClientBuilder buildClientBuilder(S3ClientSettings clientSettings) {
117116
final AmazonS3ClientBuilder builder = super.buildClientBuilder(clientSettings);
118117
final DnsResolver defaultDnsResolver = builder.getClientConfiguration().getDnsResolver();
119118
builder.getClientConfiguration().setDnsResolver(host -> {
120-
if (shouldErrorOnDns.get() && randomBoolean() && randomBoolean()) {
119+
if (shouldErrorOnDns && randomBoolean() && randomBoolean()) {
121120
throw new UnknownHostException(host);
122121
}
123122
return defaultDnsResolver.resolve(host);
@@ -653,7 +652,7 @@ public void testReadWithIndicesPurposeRetriesForever() throws IOException {
653652

654653
final byte[] bytes = randomBlobContent(512);
655654

656-
shouldErrorOnDns.set(true);
655+
shouldErrorOnDns = true;
657656
final AtomicInteger failures = new AtomicInteger();
658657
@SuppressForbidden(reason = "use a http server")
659658
class FlakyReadHandler implements HttpHandler {
@@ -776,7 +775,7 @@ public void testSuppressedDeletionErrorsAreCapped() {
776775
int maxBulkDeleteSize = randomIntBetween(1, 10);
777776
final BlobContainer blobContainer = createBlobContainer(1, readTimeout, true, null, maxBulkDeleteSize);
778777
httpServer.createContext("/", exchange -> {
779-
if (exchange.getRequestMethod().equals("POST") && exchange.getRequestURI().toString().startsWith("/bucket/?delete")) {
778+
if (isMultiDeleteRequest(exchange)) {
780779
exchange.sendResponseHeaders(
781780
randomFrom(
782781
HttpStatus.SC_INTERNAL_SERVER_ERROR,
@@ -810,7 +809,7 @@ public void testTrimmedLogAndCappedSuppressedErrorOnMultiObjectDeletionException
810809

811810
final Pattern pattern = Pattern.compile("<Key>(.+?)</Key>");
812811
httpServer.createContext("/", exchange -> {
813-
if (exchange.getRequestMethod().equals("POST") && exchange.getRequestURI().toString().startsWith("/bucket/?delete")) {
812+
if (isMultiDeleteRequest(exchange)) {
814813
final String requestBody = Streams.copyToString(new InputStreamReader(exchange.getRequestBody(), StandardCharsets.UTF_8));
815814
final var matcher = pattern.matcher(requestBody);
816815
final StringBuilder deletes = new StringBuilder();
@@ -962,6 +961,10 @@ private Map<String, Object> metricAttributes(String action) {
962961
return Map.of("repo_type", "s3", "repo_name", "repository", "operation", "GetObject", "purpose", "Indices", "action", action);
963962
}
964963

964+
private static boolean isMultiDeleteRequest(HttpExchange exchange) {
965+
return new S3HttpHandler("bucket").parseRequest(exchange).isMultiObjectDeleteRequest();
966+
}
967+
965968
/**
966969
* Asserts that an InputStream is fully consumed, or aborted, when it is closed
967970
*/

0 commit comments

Comments
 (0)