diff --git a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/waiters/AsyncWaiterExecutor.java b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/waiters/AsyncWaiterExecutor.java index cde52f85d22a..de4be0440134 100644 --- a/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/waiters/AsyncWaiterExecutor.java +++ b/core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/waiters/AsyncWaiterExecutor.java @@ -104,10 +104,21 @@ private void runAsyncPollingFunction(Supplier> asyncPolling future.completeExceptionally(new UnsupportedOperationException()); } } else { - future.completeExceptionally(executorHelper.noneMatchException(responseOrException)); + Optional t = responseOrException.right(); + if (t.isPresent() && t.get() instanceof Error) { + future.completeExceptionally(t.get()); + } else { + future.completeExceptionally(executorHelper.noneMatchException(responseOrException)); + } } } catch (Throwable t) { - future.completeExceptionally(SdkClientException.create("Encountered unexpected exception.", t)); + Throwable cause = t instanceof CompletionException ? t.getCause() : t; + + if (cause instanceof Error) { + future.completeExceptionally(cause); + } else { + future.completeExceptionally(SdkClientException.create("Encountered unexpected exception.", cause)); + } } }); } diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/waiters/WaitersAsyncFunctionalTest.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/waiters/WaitersAsyncFunctionalTest.java index 4b958d34b329..d114f66c7d82 100644 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/waiters/WaitersAsyncFunctionalTest.java +++ b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/waiters/WaitersAsyncFunctionalTest.java @@ -198,6 +198,13 @@ public void failureException_shouldThrowException() { .hasCauseInstanceOf(SdkClientException.class); } + @Test + void errorShouldNotBeWrapped() { + when(asyncClient.allTypes(any(AllTypesRequest.class))).thenReturn(CompletableFutureUtils.failedFuture(new OutOfMemoryError())); + assertThatThrownBy(() -> asyncWaiter.waitUntilAllTypesSuccess(SdkBuilder::build).join()) + .hasCauseInstanceOf(Error.class); + } + @Test public void closeWaiterCreatedWithClient_clientDoesNotClose() { asyncWaiter.close();