@@ -117,19 +117,19 @@ public class S3BlobContainerRetriesTests extends AbstractBlobContainerRetriesTes
117117
118118    private  static  final  int  MAX_NUMBER_SNAPSHOT_DELETE_RETRIES  = 10 ;
119119    private  S3Service  service ;
120-     private  AtomicBoolean  shouldErrorOnDns ;
120+     private  volatile   boolean  shouldErrorOnDns ;
121121    private  RecordingMeterRegistry  recordingMeterRegistry ;
122122
123123    @ Before 
124124    public  void  setUp () throws  Exception  {
125-         shouldErrorOnDns  = new   AtomicBoolean ( false ) ;
125+         shouldErrorOnDns  = false ;
126126        service  = new  S3Service (Mockito .mock (Environment .class ), Settings .EMPTY , Mockito .mock (ResourceWatcherService .class )) {
127127            @ Override 
128128            protected  AmazonS3ClientBuilder  buildClientBuilder (S3ClientSettings  clientSettings ) {
129129                final  AmazonS3ClientBuilder  builder  = super .buildClientBuilder (clientSettings );
130130                final  DnsResolver  defaultDnsResolver  = builder .getClientConfiguration ().getDnsResolver ();
131131                builder .getClientConfiguration ().setDnsResolver (host  -> {
132-                     if  (shouldErrorOnDns . get ()  && randomBoolean () && randomBoolean ()) {
132+                     if  (shouldErrorOnDns  && randomBoolean () && randomBoolean ()) {
133133                        throw  new  UnknownHostException (host );
134134                    }
135135                    return  defaultDnsResolver .resolve (host );
@@ -721,7 +721,7 @@ public void testReadWithIndicesPurposeRetriesForever() throws IOException {
721721
722722        final  byte [] bytes  = randomBlobContent (512 );
723723
724-         shouldErrorOnDns . set ( true ) ;
724+         shouldErrorOnDns  =  true ;
725725        final  AtomicInteger  failures  = new  AtomicInteger ();
726726        @ SuppressForbidden (reason  = "use a http server" )
727727        class  FlakyReadHandler  implements  HttpHandler  {
@@ -949,7 +949,7 @@ private int expectedNumberOfBatches(int blobsToDelete) {
949949    }
950950
951951    @ SuppressForbidden (reason  = "use a http server" )
952-     private  class  ThrottlingDeleteHandler  extends  S3HttpHandler  {
952+     private  static   class  ThrottlingDeleteHandler  extends  S3HttpHandler  {
953953
954954        private  static  final  String  THROTTLING_ERROR_CODE  = "SlowDown" ;
955955
@@ -974,7 +974,7 @@ private class ThrottlingDeleteHandler extends S3HttpHandler {
974974
975975        @ Override 
976976        public  void  handle (HttpExchange  exchange ) throws  IOException  {
977-             if  (exchange . getRequestMethod (). equals ( "POST" ) &&  exchange . getRequestURI (). toString (). startsWith ( "/bucket/?delete" )) {
977+             if  (isMultiDeleteRequest ( exchange )) {
978978                onAttemptCallback .accept (numberOfDeleteAttempts .get ());
979979                numberOfDeleteAttempts .incrementAndGet ();
980980                if  (throttleTimesBeforeSuccess .getAndDecrement () > 0 ) {
@@ -1078,7 +1078,7 @@ public void testSuppressedDeletionErrorsAreCapped() {
10781078        int  maxBulkDeleteSize  = randomIntBetween (1 , 10 );
10791079        final  BlobContainer  blobContainer  = createBlobContainer (1 , readTimeout , true , null , maxBulkDeleteSize );
10801080        httpServer .createContext ("/" , exchange  -> {
1081-             if  (exchange . getRequestMethod (). equals ( "POST" ) &&  exchange . getRequestURI (). toString (). startsWith ( "/bucket/?delete" )) {
1081+             if  (isMultiDeleteRequest ( exchange )) {
10821082                exchange .sendResponseHeaders (
10831083                    randomFrom (
10841084                        HttpStatus .SC_INTERNAL_SERVER_ERROR ,
@@ -1112,7 +1112,7 @@ public void testTrimmedLogAndCappedSuppressedErrorOnMultiObjectDeletionException
11121112
11131113        final  Pattern  pattern  = Pattern .compile ("<Key>(.+?)</Key>" );
11141114        httpServer .createContext ("/" , exchange  -> {
1115-             if  (exchange . getRequestMethod (). equals ( "POST" ) &&  exchange . getRequestURI (). toString (). startsWith ( "/bucket/?delete" )) {
1115+             if  (isMultiDeleteRequest ( exchange )) {
11161116                final  String  requestBody  = Streams .copyToString (new  InputStreamReader (exchange .getRequestBody (), StandardCharsets .UTF_8 ));
11171117                final  var  matcher  = pattern .matcher (requestBody );
11181118                final  StringBuilder  deletes  = new  StringBuilder ();
@@ -1249,6 +1249,10 @@ private Map<String, Object> metricAttributes(String action) {
12491249        return  Map .of ("repo_type" , "s3" , "repo_name" , "repository" , "operation" , "GetObject" , "purpose" , "Indices" , "action" , action );
12501250    }
12511251
1252+     private  static  boolean  isMultiDeleteRequest (HttpExchange  exchange ) {
1253+         return  new  S3HttpHandler ("bucket" ).parseRequest (exchange ).isMultiObjectDeleteRequest ();
1254+     }
1255+ 
12521256    /** 
12531257     * Asserts that an InputStream is fully consumed, or aborted, when it is closed 
12541258     */ 
0 commit comments