Skip to content

Commit 3f19f03

Browse files
committed
Migrate tests away from S3 SDK MD5DigestCalculatingInputStream
`S3BlobContainerRetriesTests` uses `MD5DigestCalculatingInputStream` from the AWS v1 SDK to compute a MD5 checksum, but this feature is not available in the v2 SDK. With this commit we remove this dependency and compute the MD5 checksums directly instead. Backport of #126099 to `8.x`
1 parent 0a70e40 commit 3f19f03

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

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

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
import com.amazonaws.DnsResolver;
1414
import com.amazonaws.SdkClientException;
1515
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
16-
import com.amazonaws.services.s3.internal.MD5DigestCalculatingInputStream;
17-
import com.amazonaws.util.Base16;
1816
import com.sun.net.httpserver.HttpExchange;
1917
import com.sun.net.httpserver.HttpHandler;
2018

@@ -25,7 +23,9 @@
2523
import org.elasticsearch.common.blobstore.BlobContainer;
2624
import org.elasticsearch.common.blobstore.BlobPath;
2725
import org.elasticsearch.common.blobstore.OperationPurpose;
26+
import org.elasticsearch.common.bytes.BytesArray;
2827
import org.elasticsearch.common.bytes.BytesReference;
28+
import org.elasticsearch.common.hash.MessageDigests;
2929
import org.elasticsearch.common.io.Streams;
3030
import org.elasticsearch.common.lucene.store.ByteArrayIndexInput;
3131
import org.elasticsearch.common.lucene.store.InputStreamIndexInput;
@@ -365,13 +365,12 @@ public void testWriteLargeBlob() throws Exception {
365365
}
366366
} else if (s3Request.isUploadPartRequest()) {
367367
// upload part request
368-
MD5DigestCalculatingInputStream md5 = new MD5DigestCalculatingInputStream(exchange.getRequestBody());
369-
BytesReference bytes = Streams.readFully(md5);
368+
BytesReference bytes = Streams.readFully(exchange.getRequestBody());
370369
assertThat((long) bytes.length(), anyOf(equalTo(lastPartSize), equalTo(bufferSize.getBytes())));
371370
assertThat(contentLength, anyOf(equalTo(lastPartSize), equalTo(bufferSize.getBytes())));
372371

373372
if (countDownUploads.decrementAndGet() % 2 == 0) {
374-
exchange.getResponseHeaders().add("ETag", Base16.encodeAsString(md5.getMd5Digest()));
373+
exchange.getResponseHeaders().add("ETag", getBase16MD5Digest(bytes));
375374
exchange.sendResponseHeaders(HttpStatus.SC_OK, -1);
376375
exchange.close();
377376
return;
@@ -463,12 +462,11 @@ public void testWriteLargeBlobStreaming() throws Exception {
463462
}
464463
} else if (s3Request.isUploadPartRequest()) {
465464
// upload part request
466-
MD5DigestCalculatingInputStream md5 = new MD5DigestCalculatingInputStream(exchange.getRequestBody());
467-
BytesReference bytes = Streams.readFully(md5);
465+
BytesReference bytes = Streams.readFully(exchange.getRequestBody());
468466

469467
if (counterUploads.incrementAndGet() % 2 == 0) {
470468
bytesReceived.addAndGet(bytes.length());
471-
exchange.getResponseHeaders().add("ETag", Base16.encodeAsString(md5.getMd5Digest()));
469+
exchange.getResponseHeaders().add("ETag", getBase16MD5Digest(bytes));
472470
exchange.sendResponseHeaders(HttpStatus.SC_OK, -1);
473471
exchange.close();
474472
return;
@@ -859,6 +857,21 @@ public void testTrimmedLogAndCappedSuppressedErrorOnMultiObjectDeletionException
859857
}
860858
}
861859

860+
private static String getBase16MD5Digest(BytesReference bytesReference) {
861+
return MessageDigests.toHexString(MessageDigests.digest(bytesReference, MessageDigests.md5()));
862+
}
863+
864+
public void testGetBase16MD5Digest() {
865+
// from Wikipedia, see also org.elasticsearch.common.hash.MessageDigestsTests.testMd5
866+
assertBase16MD5Digest("", "d41d8cd98f00b204e9800998ecf8427e");
867+
assertBase16MD5Digest("The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6");
868+
assertBase16MD5Digest("The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0");
869+
}
870+
871+
private static void assertBase16MD5Digest(String input, String expectedDigestString) {
872+
assertEquals(expectedDigestString, getBase16MD5Digest(new BytesArray(input)));
873+
}
874+
862875
@Override
863876
protected Matcher<Integer> getMaxRetriesMatcher(int maxRetries) {
864877
// some attempts make meaningful progress and do not count towards the max retry limit

0 commit comments

Comments
 (0)