Enforce deadlines and cancel expired Gun streams - #591
Open
aej wants to merge 6 commits into
Open
Conversation
aej
marked this pull request as ready for review
September 11, 2026 13:59
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fix the Gun client adapter so a finite RPC timeout is enforced as one absolute deadline across the whole call.
When that deadline expires, the adapter now cancels the Gun stream, stops its response process, and removes the connection-process bookkeeping entry. The shared HTTP/2 connection remains available for later RPCs.
Background
The Gun adapter previously doubled the configured timeout on every response wait. That was originally intended to give the server time to enforce the wire-level
grpc-timeoutand return its ownDEADLINE_EXCEEDEDresponse.Because each headers, data, and trailers wait started a fresh doubled timeout, however, a finite RPC could run well beyond its configured deadline. When a local wait finally timed out, the response process, Gun stream, and bookkeeping entry were also left behind.
Changes
grpc-timeoutwire header unchanged.The first terminal event wins: a response handled before expiry succeeds; expiry handled first returns
DEADLINE_EXCEEDED. Local expiry may therefore cancel the request before the server logs its own deadline.Validation
mix run script/run.exs --rounds 20 --concurrency 2passes.mix test --warnings-as-errors --max-cases 1grpc_core: 122 tests/doctests, 0 failuresgrpc_server: 213 tests/doctests, 0 failuresgrpc: 377 tests/doctests, 0 failures, 2 skipped