From f20c96d3dfbbf71de92cadaf9b2fad8f1b0ecccb Mon Sep 17 00:00:00 2001 From: waterWang Date: Wed, 29 Jul 2026 14:26:07 +0800 Subject: [PATCH] fix: make perAttemptRecvTimeout actually apply to retry attempts The perAttemptRecvTimeout field in RetryPolicy has been configurable since PR #8301 but was never actually applied to individual retry attempts. The DeadlineEntry in RetriableStream.setDeadline() simply passed through the original deadline without considering the per-attempt timeout. Fix: When perAttemptRecvTimeoutNanos is set in the retry policy, apply the minimum of the original deadline and the per-attempt deadline to each substream. This ensures that each retry attempt is bounded by the per-attempt timeout, relative to when the attempt starts. Fixes #12919 [fj4WqyCCw3C5ShR1RfB7MoBPTpkRrBFYP1uT35g3MvT] --- core/src/main/java/io/grpc/internal/RetriableStream.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/io/grpc/internal/RetriableStream.java b/core/src/main/java/io/grpc/internal/RetriableStream.java index 0c37a0beaca..d12341b379c 100644 --- a/core/src/main/java/io/grpc/internal/RetriableStream.java +++ b/core/src/main/java/io/grpc/internal/RetriableStream.java @@ -754,7 +754,13 @@ public final void setDeadline(final Deadline deadline) { class DeadlineEntry implements BufferEntry { @Override public void runWith(Substream substream) { - substream.stream.setDeadline(deadline); + if (retryPolicy != null && retryPolicy.perAttemptRecvTimeoutNanos != null) { + Deadline perAttemptDeadline = + Deadline.after(retryPolicy.perAttemptRecvTimeoutNanos, TimeUnit.NANOSECONDS); + substream.stream.setDeadline(deadline.minimum(perAttemptDeadline)); + } else { + substream.stream.setDeadline(deadline); + } } }