Skip to content

Commit 84baad8

Browse files
kessplasimabhichow
andauthored
fix: unwrap completion exception in AbortMultipartUpload and inside multipart putObject (#174)
* fix: unwrap completion exception in AbortMultipartUpload and inside multipart putObject --------- Co-authored-by: Darwin Chowdary <[email protected]>
1 parent 926818b commit 84baad8

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

src/main/java/software/amazon/encryption/s3/S3EncryptionClient.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,13 @@ public CompleteMultipartUploadResponse completeMultipartUpload(CompleteMultipart
461461
@Override
462462
public AbortMultipartUploadResponse abortMultipartUpload(AbortMultipartUploadRequest request)
463463
throws AwsServiceException, SdkClientException {
464-
return _multipartPipeline.abortMultipartUpload(request);
464+
try {
465+
return _multipartPipeline.abortMultipartUpload(request);
466+
} catch (CompletionException e) {
467+
throw new S3EncryptionClientException(e.getCause().getMessage(), e.getCause());
468+
} catch (Exception e) {
469+
throw new S3EncryptionClientException("Unable to abort Multipart upload.", e);
470+
}
465471
}
466472

467473
/**

src/main/java/software/amazon/encryption/s3/internal/UploadObjectObserver.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@
1414
import software.amazon.awssdk.services.s3.model.UploadPartRequest;
1515
import software.amazon.awssdk.services.s3.model.UploadPartResponse;
1616
import software.amazon.encryption.s3.S3EncryptionClient;
17+
import software.amazon.encryption.s3.S3EncryptionClientException;
1718

1819
import java.io.File;
1920
import java.util.ArrayList;
2021
import java.util.Collections;
2122
import java.util.List;
2223
import java.util.Map;
2324
import java.util.concurrent.Callable;
25+
import java.util.concurrent.CompletionException;
2426
import java.util.concurrent.ExecutorService;
2527
import java.util.concurrent.Future;
2628

@@ -70,6 +72,9 @@ public Map<Integer, UploadPartResponse> call() {
7072
try {
7173
AsyncRequestBody noRetriesBody = new NoRetriesAsyncRequestBody(AsyncRequestBody.fromFile(part));
7274
return uploadPart(reqUploadPart, noRetriesBody);
75+
} catch (CompletionException e) {
76+
// Unwrap completion exception
77+
throw new S3EncryptionClientException(e.getCause().getMessage(), e.getCause());
7378
} finally {
7479
// clean up part already uploaded
7580
if (!part.delete()) {

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

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
2222
import software.amazon.awssdk.services.s3.model.NoSuchBucketException;
2323
import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
24+
import software.amazon.awssdk.services.s3.model.NoSuchUploadException;
2425
import software.amazon.awssdk.services.s3.model.ObjectIdentifier;
2526
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
2627
import software.amazon.awssdk.services.s3.model.S3Exception;
@@ -44,6 +45,7 @@
4445

4546
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
4647
import static org.junit.jupiter.api.Assertions.assertEquals;
48+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
4749
import static org.junit.jupiter.api.Assertions.assertThrows;
4850
import static org.junit.jupiter.api.Assertions.assertTrue;
4951
import static org.mockito.ArgumentMatchers.any;
@@ -618,7 +620,7 @@ public void createMultipartUploadFailure() {
618620
v3Client.createMultipartUpload(builder -> builder.bucket("NotMyBukkit").key("InvalidKey").build());
619621
} catch (S3EncryptionClientException exception) {
620622
// Verify inner exception
621-
assertTrue(exception.getCause() instanceof NoSuchBucketException);
623+
assertInstanceOf(NoSuchBucketException.class, exception.getCause());
622624
}
623625

624626
v3Client.close();
@@ -642,15 +644,15 @@ public void uploadPartFailure() {
642644
RequestBody.fromInputStream(new BoundedInputStream(16), 16));
643645
} catch (S3EncryptionClientException exception) {
644646
// Verify inner exception
645-
assertTrue(exception.getCause() instanceof NoSuchBucketException);
647+
assertInstanceOf(NoSuchBucketException.class, exception.getCause());
646648
}
647649

648-
// MPU was not completed, but delete to be safe
650+
// MPU was not completed, but abort and delete to be safe
651+
v3Client.abortMultipartUpload(builder -> builder.bucket(BUCKET).key(objectKey).uploadId(initiateResult.uploadId()).build());
649652
deleteObject(BUCKET, objectKey, v3Client);
650653
v3Client.close();
651654
}
652655

653-
654656
@Test
655657
public void completeMultipartUploadFailure() {
656658
// V3 Client
@@ -661,7 +663,26 @@ public void completeMultipartUploadFailure() {
661663
v3Client.completeMultipartUpload(builder -> builder.bucket("NotMyBukkit").key("InvalidKey").uploadId("Invalid").build());
662664
} catch (S3EncryptionClientException exception) {
663665
// Verify inner exception
664-
assertTrue(exception.getCause() instanceof NoSuchBucketException);
666+
assertInstanceOf(NoSuchBucketException.class, exception.getCause());
667+
}
668+
669+
v3Client.close();
670+
}
671+
672+
@Test
673+
public void abortMultipartUploadFailure() {
674+
final String objectKey = appendTestSuffix("abort-multipart-failure");
675+
676+
// V3 Client
677+
S3Client v3Client = S3EncryptionClient.builder()
678+
.aesKey(AES_KEY)
679+
.build();
680+
681+
try {
682+
v3Client.abortMultipartUpload(builder -> builder.bucket(BUCKET).key(objectKey).uploadId("invalid upload id").build());
683+
} catch (S3EncryptionClientException exception) {
684+
// Verify inner exception
685+
assertInstanceOf(NoSuchUploadException.class, exception.getCause());
665686
}
666687

667688
v3Client.close();

0 commit comments

Comments
 (0)