Skip to content

Commit 0a9f0ec

Browse files
author
Anirav Kareddy
committed
trying a new approach via retry_mode ad max_attempts
1 parent 1f47691 commit 0a9f0ec

File tree

2 files changed

+98
-100
lines changed

2 files changed

+98
-100
lines changed

.github/workflows/build.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ jobs:
4646

4747
- name: Test
4848
env:
49-
AWS_DEFAULTS_MODE: mobile
49+
AWS_DEFAULTS_MODE: standard
50+
AWS_RETRY_MODE: adaptive
51+
AWS_MAX_ATTEMPTS: '10'
5052
AWS_SDK_CLIENT_LOGGING: debug
5153
run: |
5254
export AWS_S3EC_TEST_ALT_KMS_KEY_ARN=arn:aws:kms:${{ vars.CI_AWS_REGION }}:${{ secrets.CI_AWS_ACCOUNT_ID }}:key/${{ vars.CI_ALT_KMS_KEY_ID }}

src/test/java/software/amazon/encryption/s3/S3EncryptionClientStreamTest.java

Lines changed: 95 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -310,130 +310,126 @@ public void failsWhenBothBufferSizeAndDelayedAuthModeEnabled() {
310310

311311
@Test
312312
public void customSetBufferSizeWithLargeObject() throws IOException {
313-
for(int i=0; i < 10; i++) {
314-
final String objectKey = appendTestSuffix("large-object-test-custom-buffer-size");
313+
final String objectKey = appendTestSuffix("large-object-test-custom-buffer-size");
315314

316-
Security.addProvider(new BouncyCastleProvider());
317-
Provider provider = Security.getProvider("BC");
315+
Security.addProvider(new BouncyCastleProvider());
316+
Provider provider = Security.getProvider("BC");
318317

319-
// V3 Client with custom max buffer size 32 MiB.
320-
S3Client v3ClientWithBuffer32MiB = S3EncryptionClient.builder()
321-
.aesKey(AES_KEY)
322-
.cryptoProvider(provider)
323-
.setBufferSize(32 * 1024 * 1024)
324-
.build();
318+
// V3 Client with custom max buffer size 32 MiB.
319+
S3Client v3ClientWithBuffer32MiB = S3EncryptionClient.builder()
320+
.aesKey(AES_KEY)
321+
.cryptoProvider(provider)
322+
.setBufferSize(32 * 1024 * 1024)
323+
.build();
325324

326-
// V3 Client with default buffer size (i.e. 64MiB)
327-
// When enableDelayedAuthenticationMode is set to true, delayed authentication mode always takes priority over buffered mode.
328-
S3Client v3ClientWithDelayedAuth = S3EncryptionClient.builder()
329-
.aesKey(AES_KEY)
330-
.cryptoProvider(provider)
331-
.enableDelayedAuthenticationMode(true)
332-
.build();
325+
// V3 Client with default buffer size (i.e. 64MiB)
326+
// When enableDelayedAuthenticationMode is set to true, delayed authentication mode always takes priority over buffered mode.
327+
S3Client v3ClientWithDelayedAuth = S3EncryptionClient.builder()
328+
.aesKey(AES_KEY)
329+
.cryptoProvider(provider)
330+
.enableDelayedAuthenticationMode(true)
331+
.build();
333332

334-
// Tight bound on the custom buffer size limit of 32MiB
335-
final long fileSizeExceedingDefaultLimit = 1024 * 1024 * 32 + 1;
333+
// Tight bound on the custom buffer size limit of 32MiB
334+
final long fileSizeExceedingDefaultLimit = 1024 * 1024 * 32 + 1;
336335

337-
byte[] data = new byte[(int) fileSizeExceedingDefaultLimit];
338-
for(int j=0; j < data.length; j++) {
339-
data[i] = (byte) (j % 256);
340-
}
341-
final InputStream largeObjectStream = new ByteArrayInputStream(data);
342-
v3ClientWithBuffer32MiB.putObject(PutObjectRequest.builder()
343-
.bucket(BUCKET)
344-
.key(objectKey)
345-
.build(), RequestBody.fromInputStream(largeObjectStream, fileSizeExceedingDefaultLimit));
336+
byte[] data = new byte[(int) fileSizeExceedingDefaultLimit];
337+
for(int j=0; j < data.length; j++) {
338+
data[i] = (byte) (j % 256);
339+
}
340+
final InputStream largeObjectStream = new ByteArrayInputStream(data);
341+
v3ClientWithBuffer32MiB.putObject(PutObjectRequest.builder()
342+
.bucket(BUCKET)
343+
.key(objectKey)
344+
.build(), RequestBody.fromInputStream(largeObjectStream, fileSizeExceedingDefaultLimit));
346345

347-
largeObjectStream.close();
346+
largeObjectStream.close();
348347

349-
// Object is larger than Buffer, so getObject fails
350-
assertThrows(S3EncryptionClientException.class, () -> v3ClientWithBuffer32MiB.getObjectAsBytes(builder -> builder
351-
.bucket(BUCKET)
352-
.key(objectKey)));
348+
// Object is larger than Buffer, so getObject fails
349+
assertThrows(S3EncryptionClientException.class, () -> v3ClientWithBuffer32MiB.getObjectAsBytes(builder -> builder
350+
.bucket(BUCKET)
351+
.key(objectKey)));
353352

354-
// You have to either enable the delayed auth mode or increase max buffer size (but in allowed bounds)
355-
ResponseInputStream<GetObjectResponse> response = v3ClientWithDelayedAuth.getObject(builder -> builder
356-
.bucket(BUCKET)
357-
.key(objectKey));
353+
// You have to either enable the delayed auth mode or increase max buffer size (but in allowed bounds)
354+
ResponseInputStream<GetObjectResponse> response = v3ClientWithDelayedAuth.getObject(builder -> builder
355+
.bucket(BUCKET)
356+
.key(objectKey));
358357

359-
// Create a new ByteArrayInputStream for comparison
360-
InputStream expectedStream = new ByteArrayInputStream(data);
361-
assertTrue(IOUtils.contentEquals(expectedStream, response));
362-
response.close();
358+
// Create a new ByteArrayInputStream for comparison
359+
InputStream expectedStream = new ByteArrayInputStream(data);
360+
assertTrue(IOUtils.contentEquals(expectedStream, response));
361+
response.close();
363362

364-
// Cleanup
365-
deleteObject(BUCKET, objectKey, v3ClientWithBuffer32MiB);
366-
v3ClientWithBuffer32MiB.close();
367-
v3ClientWithDelayedAuth.close();
368-
}
363+
// Cleanup
364+
deleteObject(BUCKET, objectKey, v3ClientWithBuffer32MiB);
365+
v3ClientWithBuffer32MiB.close();
366+
v3ClientWithDelayedAuth.close();
369367
}
370368

371369
@Test
372370
public void customSetBufferSizeWithLargeObjectAsyncClient() throws IOException {
373-
for(int i=0; i < 10;i++) {
374-
final String objectKey = appendTestSuffix("large-object-test-custom-buffer-size-async");
371+
final String objectKey = appendTestSuffix("large-object-test-custom-buffer-size-async");
375372

376-
Security.addProvider(new BouncyCastleProvider());
377-
Provider provider = Security.getProvider("BC");
373+
Security.addProvider(new BouncyCastleProvider());
374+
Provider provider = Security.getProvider("BC");
378375

379-
// V3 Client with custom max buffer size 32 MiB.
380-
S3AsyncClient v3ClientWithBuffer32MiB = S3AsyncEncryptionClient.builder()
381-
.aesKey(AES_KEY)
382-
.cryptoProvider(provider)
383-
.setBufferSize(32 * 1024 * 1024)
384-
.build();
385-
386-
// V3 Client with default buffer size (i.e. 64MiB)
387-
// When enableDelayedAuthenticationMode is set to true, delayed authentication mode always takes priority over buffered mode.
388-
S3AsyncClient v3ClientWithDelayedAuth = S3AsyncEncryptionClient.builder()
389-
.aesKey(AES_KEY)
390-
.cryptoProvider(provider)
391-
.enableDelayedAuthenticationMode(true)
392-
.build();
376+
// V3 Client with custom max buffer size 32 MiB.
377+
S3AsyncClient v3ClientWithBuffer32MiB = S3AsyncEncryptionClient.builder()
378+
.aesKey(AES_KEY)
379+
.cryptoProvider(provider)
380+
.setBufferSize(32 * 1024 * 1024)
381+
.build();
393382

394-
// Tight bound on the custom buffer size limit of 32MiB
395-
final long fileSizeExceedingDefaultLimit = 1024 * 1024 * 32 + 1;
396-
byte[] data = new byte[(int) fileSizeExceedingDefaultLimit];
397-
for(int j=0; j < data.length; j++) {
398-
data[i] = (byte) (j % 256);
399-
}
400-
final InputStream largeObjectStream = new ByteArrayInputStream(data);
401-
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
402-
CompletableFuture<PutObjectResponse> futurePut = v3ClientWithBuffer32MiB.putObject(PutObjectRequest.builder()
403-
.bucket(BUCKET)
404-
.key(objectKey)
405-
.build(), AsyncRequestBody.fromInputStream(largeObjectStream, fileSizeExceedingDefaultLimit, singleThreadExecutor));
383+
// V3 Client with default buffer size (i.e. 64MiB)
384+
// When enableDelayedAuthenticationMode is set to true, delayed authentication mode always takes priority over buffered mode.
385+
S3AsyncClient v3ClientWithDelayedAuth = S3AsyncEncryptionClient.builder()
386+
.aesKey(AES_KEY)
387+
.cryptoProvider(provider)
388+
.enableDelayedAuthenticationMode(true)
389+
.build();
406390

407-
futurePut.join();
408-
largeObjectStream.close();
409-
singleThreadExecutor.shutdown();
391+
// Tight bound on the custom buffer size limit of 32MiB
392+
final long fileSizeExceedingDefaultLimit = 1024 * 1024 * 32 + 1;
393+
byte[] data = new byte[(int) fileSizeExceedingDefaultLimit];
394+
for(int j=0; j < data.length; j++) {
395+
data[i] = (byte) (j % 256);
396+
}
397+
final InputStream largeObjectStream = new ByteArrayInputStream(data);
398+
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
399+
CompletableFuture<PutObjectResponse> futurePut = v3ClientWithBuffer32MiB.putObject(PutObjectRequest.builder()
400+
.bucket(BUCKET)
401+
.key(objectKey)
402+
.build(), AsyncRequestBody.fromInputStream(largeObjectStream, fileSizeExceedingDefaultLimit, singleThreadExecutor));
410403

411-
try {
412-
// Object is larger than Buffer, so getObject fails
413-
CompletableFuture<ResponseInputStream<GetObjectResponse>> futureResponse = v3ClientWithBuffer32MiB.getObject(builder -> builder
414-
.bucket(BUCKET)
415-
.key(objectKey), AsyncResponseTransformer.toBlockingInputStream());
416-
futureResponse.join();
417-
} catch (CompletionException e) {
418-
assertEquals(S3EncryptionClientException.class, e.getCause().getClass());
419-
}
404+
futurePut.join();
405+
largeObjectStream.close();
406+
singleThreadExecutor.shutdown();
420407

421-
// You have to either enable the delayed auth mode or increase max buffer size (but in allowed bounds)
422-
CompletableFuture<ResponseInputStream<GetObjectResponse>> futureGet = v3ClientWithDelayedAuth.getObject(builder -> builder
408+
try {
409+
// Object is larger than Buffer, so getObject fails
410+
CompletableFuture<ResponseInputStream<GetObjectResponse>> futureResponse = v3ClientWithBuffer32MiB.getObject(builder -> builder
423411
.bucket(BUCKET)
424412
.key(objectKey), AsyncResponseTransformer.toBlockingInputStream());
425-
ResponseInputStream<GetObjectResponse> output = futureGet.join();
413+
futureResponse.join();
414+
} catch (CompletionException e) {
415+
assertEquals(S3EncryptionClientException.class, e.getCause().getClass());
416+
}
417+
418+
// You have to either enable the delayed auth mode or increase max buffer size (but in allowed bounds)
419+
CompletableFuture<ResponseInputStream<GetObjectResponse>> futureGet = v3ClientWithDelayedAuth.getObject(builder -> builder
420+
.bucket(BUCKET)
421+
.key(objectKey), AsyncResponseTransformer.toBlockingInputStream());
422+
ResponseInputStream<GetObjectResponse> output = futureGet.join();
426423

427-
ByteArrayInputStream expectedStream = new ByteArrayInputStream(data);
428-
assertTrue(IOUtils.contentEquals(expectedStream, output));
424+
ByteArrayInputStream expectedStream = new ByteArrayInputStream(data);
425+
assertTrue(IOUtils.contentEquals(expectedStream, output));
429426

430-
output.close();
427+
output.close();
431428

432-
// Cleanup
433-
deleteObject(BUCKET, objectKey, v3ClientWithBuffer32MiB);
434-
v3ClientWithBuffer32MiB.close();
435-
v3ClientWithDelayedAuth.close();
436-
}
429+
// Cleanup
430+
deleteObject(BUCKET, objectKey, v3ClientWithBuffer32MiB);
431+
v3ClientWithBuffer32MiB.close();
432+
v3ClientWithDelayedAuth.close();
437433
}
438434

439435
@Test

0 commit comments

Comments
 (0)