HTTP/2 to origin session pool and reliability fixes - #13447
Open
bneradt wants to merge 1 commit into
Open
Conversation
Long-lived HTTP/2 origin connections could remain discoverable after entering half-close, become unreachable when global pooling was configured, or be poisoned by a single request's Connection: close header. Requests assigned to those sessions could fail immediately. Valid responses could also be rejected when headers used CONTINUATION, when their payload length followed HEAD or 304 rules, or when normal SETTINGS acknowledgments crossed the receive-rate limit. This makes outbound HTTP/2 session lifecycle consistently thread-local. It always probes the thread pool before configured global pools, ignores Connection: close for outbound session shutdown, refuses to re-pool half-closed sessions, and evicts sessions as soon as they enter local half-close. HTTP/1.x global pooling behavior remains unchanged. This also carries the protocol's not-processed guarantee from GOAWAY and RST_STREAM REFUSED_STREAM into retry selection. It permits safe replay of non-idempotent requests and rearms a fully buffered request body before a retry. SETTINGS acknowledgments are excluded from the peer abuse limit because their rate is bounded by settings sent by Traffic Server. This accepts CONTINUATION frames in valid outbound stream states without creating a second transaction and preserves request metadata needed to validate HEAD and conditional 304 responses. Replay-based AuTests and custom HTTP/2 origins cover session reuse, half-close handling, retries, split response headers, payload validation, and SETTINGS accounting.
bneradt
force-pushed
the
h2-origin-session-pool-fixes
branch
from
July 29, 2026 02:11
bfd25fe to
d2127b4
Compare
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.
Long-lived HTTP/2 origin connections could remain discoverable after
entering half-close, become unreachable when global pooling was
configured, or be poisoned by a single request's Connection: close
header. Requests assigned to those sessions could fail immediately.
Valid responses could also be rejected when headers used CONTINUATION,
when their payload length followed HEAD or 304 rules, or when normal
SETTINGS acknowledgments crossed the receive-rate limit.
This makes outbound HTTP/2 session lifecycle consistently thread-local.
It always probes the thread pool before configured global pools, ignores
Connection: close for outbound session shutdown, refuses to re-pool
half-closed sessions, and evicts sessions as soon as they enter local
half-close. HTTP/1.x global pooling behavior remains unchanged.
This also carries the protocol's not-processed guarantee from GOAWAY and
RST_STREAM REFUSED_STREAM into retry selection. It permits safe replay
of non-idempotent requests and rearms a fully buffered request body
before a retry. SETTINGS acknowledgments are excluded from the peer
abuse limit because their rate is bounded by settings sent by Traffic
Server.
This accepts CONTINUATION frames in valid outbound stream states without
creating a second transaction and preserves request metadata needed to
validate HEAD and conditional 304 responses. Replay-based AuTests and
custom HTTP/2 origins cover session reuse, half-close handling, retries,
split response headers, payload validation, and SETTINGS accounting.