Skip to content

io.netty.handler.timeout.ReadTimeoutException not getting retried for S3AsyncClient::getObject #6581

@ZhaoMJ

Description

@ZhaoMJ

Describe the bug

We have noticed that S3AsyncClient does not retry io.netty.handler.timeout.ReadTimeoutException:

[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	Caused by: java.util.concurrent.ExecutionException: software.amazon.awssdk.core.exception.SdkClientException: Unable to execute HTTP request: null (SDK Attempt Count: 1)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2073)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at com.drw.xd.objectstorage.S3InputStream$S3InputStreamEnumeration.nextElement(S3InputStream.java:114)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		... 8 more
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	Caused by: software.amazon.awssdk.core.exception.SdkClientException: Unable to execute HTTP request: null (SDK Attempt Count: 1)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:130)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:95)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.core.internal.http.pipeline.stages.utils.RetryableStageHelper.retryPolicyDisallowedRetryException(RetryableStageHelper.java:168)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.maybeAttemptExecute(AsyncRetryableStage.java:139)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.maybeRetryExecute(AsyncRetryableStage.java:157)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.lambda$attemptExecute$1(AsyncRetryableStage.java:117)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.utils.CompletableFutureUtils.lambda$forwardExceptionTo$0(CompletableFutureUtils.java:78)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.lambda$execute$0(MakeAsyncHttpRequestStage.java:108)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.completeResponseFuture(MakeAsyncHttpRequestStage.java:255)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.lambda$executeHttpRequest$3(MakeAsyncHttpRequestStage.java:167)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 		at java.base/java.lang.Thread.run(Thread.java:840)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	Caused by: io.netty.handler.timeout.ReadTimeoutException
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: Caused by: java.util.concurrent.ExecutionException: software.amazon.awssdk.core.exception.SdkClientException: Unable to execute HTTP request: null (SDK Attempt Count: 1)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2073)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at com.drw.xd.objectstorage.S3InputStream$S3InputStreamEnumeration.nextElement(S3InputStream.java:114)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	... 10 more
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: Caused by: software.amazon.awssdk.core.exception.SdkClientException: Unable to execute HTTP request: null (SDK Attempt Count: 1)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:130)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:95)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.core.internal.http.pipeline.stages.utils.RetryableStageHelper.retryPolicyDisallowedRetryException(RetryableStageHelper.java:168)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.maybeAttemptExecute(AsyncRetryableStage.java:139)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.maybeRetryExecute(AsyncRetryableStage.java:157)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.core.internal.http.pipeline.stages.AsyncRetryableStage$RetryingExecutor.lambda$attemptExecute$1(AsyncRetryableStage.java:117)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.utils.CompletableFutureUtils.lambda$forwardExceptionTo$0(CompletableFutureUtils.java:78)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.lambda$execute$0(MakeAsyncHttpRequestStage.java:108)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.completeResponseFuture(MakeAsyncHttpRequestStage.java:255)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRequestStage.lambda$executeHttpRequest$3(MakeAsyncHttpRequestStage.java:167)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: 	at java.base/java.lang.Thread.run(Thread.java:840)
[2025-11-22, 08:17:29 UTC] {pod.py:942} INFO - [base] logs: Caused by: [CIRCULAR REFERENCE: io.netty.handler.timeout.ReadTimeoutException]

Regression Issue

  • Select this option if this issue appears to be a regression.

Expected Behavior

ReadTimeoutException should be retried.

Current Behavior

ReadTimeoutException is not being retried, but thrown as retryPolicyDisallowedRetryException.

Per #686, ReadTimeoutException should be wrapped as an IOException and retried by RetryStrategy. However, decorateException doesn't appear to be used in the call chain.

Reproduction Steps

Keep firing a lot getObject, until io.netty.handler.timeout.ReadTimeoutException is thrown.
Observe that the error is thrown directly without being retried.

Possible Solution

No response

Additional Information/Context

No response

AWS Java SDK version used

2.35.11

JDK version used

openjdk version "17.0.10" 2024-01-16 LTS OpenJDK Runtime Environment Corretto-17.0.10.7.1 (build 17.0.10+7-LTS) OpenJDK 64-Bit Server VM Corretto-17.0.10.7.1 (build 17.0.10+7-LTS, mixed mode, sharing)

Operating System and version

Amazon Linux 2

Metadata

Metadata

Assignees

Labels

bugThis issue is a bug.p2This is a standard priority issueresponse-requestedWaiting on additional info and feedback. Will move to "closing-soon" in 10 days.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions