Skip to content

fix(prompt): propagate wrapped cancellation through retries - #2274

Open
kyboi wants to merge 1 commit into
JetBrains:developfrom
Kreoh:contribute/retry-wrapped-cancellation
Open

kyboi wants to merge 1 commit into
JetBrains:developfrom
Kreoh:contribute/retry-wrapped-cancellation

Conversation

@kyboi

@kyboi kyboi commented Sep 29, 2026

Copy link
Copy Markdown

RetryingLLMClient propagates direct cancellation but can retry an exception that wraps it when the outer message matches a retryable error. A delegate throwing IllegalStateException("429 Too Many Requests", cancellation) is invoked three times with maxAttempts = 3.

Check the cause chain before retry handling and propagate the original CancellationException in both ordinary and streaming calls, including after the first frame. Bound traversal to 32 throwable nodes and stop on identity cycles. Cancellation deeper than that bound falls back to the existing handling of the outer exception.

This fix is already included in Kroog and working in production applications using Kroog. This patch extracts the cancellation handling from a9b1ecdbf, using a dedicated traversal rather than the broader retry-classification helpers. No dependencies or public signatures change.

Validation: ordinary and streaming regressions fail before the fix, observing three attempts instead of one; the exact issue reproduction also fails before the fix. All 54 tests in the client module JVM suite pass with no skips, including direct and nested cancellation, non-retryable wrappers, streaming before and after a frame, cause cycles and the traversal boundary. JVM JAR, ktlint and publication metadata checks pass; the compiled JVM ABI matches the checked-in dump. These tests keep the caller active while the delegate throws wrapped cancellation. Repository-wide, non-JVM and live-provider tests were not run.

Closes #2273.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

RetryingLLMClient retries exceptions that wrap cancellation

1 participant