Skip to content

Commit ff52a5f

Browse files
committed
Handled Zoe's comments
1 parent d1096c3 commit ff52a5f

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/crossregion/S3CrossRegionAsyncClient.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,9 @@ protected <T extends S3Request, ReturnT> CompletableFuture<ReturnT> invokeOperat
6262
operation.apply(request)
6363
.whenComplete((r, t) -> {
6464
if (t != null) {
65-
if (isS3RedirectException(t.getCause())) {
65+
if (isS3RedirectException(t)) {
6666
bucketToRegionCache.remove(bucketName);
67-
Optional<String> bucketRegionFromException =
68-
getBucketRegionFromException((S3Exception) t.getCause());
69-
70-
if (bucketRegionFromException.isPresent()) {
71-
sendRequestWithRightRegion(request, operation, bucketName, returnFuture,
72-
bucketRegionFromException);
73-
} else {
74-
fetchRegionAndSendRequest(request, operation, bucketName, returnFuture);
75-
}
67+
requestWithCrossRegion(request, operation, bucketName, returnFuture, t);
7668
return;
7769
}
7870
returnFuture.completeExceptionally(t);
@@ -83,6 +75,21 @@ protected <T extends S3Request, ReturnT> CompletableFuture<ReturnT> invokeOperat
8375
return returnFuture;
8476
}
8577

78+
private <T extends S3Request, ReturnT> void requestWithCrossRegion(T request,
79+
Function<T, CompletableFuture<ReturnT>> operation,
80+
String bucketName,
81+
CompletableFuture<ReturnT> returnFuture,
82+
Throwable t) {
83+
84+
Optional<String> bucketRegionFromException = getBucketRegionFromException((S3Exception) t.getCause());
85+
if (bucketRegionFromException.isPresent()) {
86+
sendRequestWithRightRegion(request, operation, bucketName, returnFuture,
87+
bucketRegionFromException);
88+
} else {
89+
fetchRegionAndSendRequest(request, operation, bucketName, returnFuture);
90+
}
91+
}
92+
8693
private <T extends S3Request, ReturnT> void fetchRegionAndSendRequest(T request,
8794
Function<T, CompletableFuture<ReturnT>> operation,
8895
String bucketName,
@@ -92,7 +99,7 @@ private <T extends S3Request, ReturnT> void fetchRegionAndSendRequest(T request,
9299
((S3AsyncClient) delegate()).headBucket(b -> b.bucket(bucketName)).whenComplete((response,
93100
throwable) -> {
94101
if (throwable != null) {
95-
if (isS3RedirectException(throwable.getCause())) {
102+
if (isS3RedirectException(throwable)) {
96103
bucketToRegionCache.remove(bucketName);
97104
Optional<String> bucketRegion = getBucketRegionFromException((S3Exception) throwable.getCause());
98105

services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/crossregion/S3CrossRegionSyncClient.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static software.amazon.awssdk.services.s3.internal.crossregion.utils.CrossRegionUtils.REDIRECT_STATUS_CODE;
1919
import static software.amazon.awssdk.services.s3.internal.crossregion.utils.CrossRegionUtils.getBucketRegionFromException;
20+
import static software.amazon.awssdk.services.s3.internal.crossregion.utils.CrossRegionUtils.isS3RedirectException;
2021
import static software.amazon.awssdk.services.s3.internal.crossregion.utils.CrossRegionUtils.requestWithDecoratedEndpointProvider;
2122

2223
import java.util.Map;
@@ -65,7 +66,7 @@ protected <T extends S3Request, ReturnT> ReturnT invokeOperation(T request, Func
6566
}
6667
return operation.apply(request);
6768
} catch (S3Exception exception) {
68-
if (exception.statusCode() == REDIRECT_STATUS_CODE) {
69+
if (isS3RedirectException(exception)) {
6970
updateCacheFromRedirectException(exception, bucketName);
7071
return operation.apply(
7172
requestWithDecoratedEndpointProvider(
@@ -88,7 +89,7 @@ private Region fetchBucketRegion(String bucketName) {
8889
try {
8990
((S3Client) delegate()).headBucket(HeadBucketRequest.builder().bucket(bucketName).build());
9091
} catch (S3Exception exception) {
91-
if (exception.statusCode() == REDIRECT_STATUS_CODE) {
92+
if (isS3RedirectException(exception)) {
9293
return Region.of(getBucketRegionFromException(exception).orElseThrow(() -> exception));
9394
}
9495
throw exception;

services/s3/src/main/java/software/amazon/awssdk/services/s3/internal/crossregion/utils/CrossRegionUtils.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818

1919
import java.util.Optional;
20+
import java.util.concurrent.CompletionException;
2021
import java.util.function.Supplier;
2122
import software.amazon.awssdk.annotations.SdkInternalApi;
2223
import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration;
@@ -42,7 +43,9 @@ public static Optional<String> getBucketRegionFromException(S3Exception exceptio
4243
}
4344

4445
public static boolean isS3RedirectException(Throwable exception) {
45-
return exception instanceof S3Exception && ((S3Exception) exception).statusCode() == REDIRECT_STATUS_CODE;
46+
Throwable exceptionToBeChecked = exception instanceof CompletionException ? exception.getCause() : exception ;
47+
return exceptionToBeChecked instanceof S3Exception
48+
&& ((S3Exception) exceptionToBeChecked).statusCode() == REDIRECT_STATUS_CODE;
4649
}
4750

4851

0 commit comments

Comments
 (0)