HTTP/2 to origin: GOAWAY closes the session at once and aborts streams at or below last_stream_id
I maintainer di solito rispondono entro 2 giorni
@bneradt ci sta già lavorando.
Dal 1/10/2026.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
Summary
When an HTTP/2 origin sends GOAWAY, ATS closes the session immediately. That aborts every stream at or below last_stream_id, even though RFC 9113 §6.8 says the peer may still finish them. Graceful drains (GOAWAY NO_ERROR with last_stream_id 2^31-1, or a real last id) therefore fail every request in flight on the connection. Requests with non-idempotent methods aren't retried, so each one goes to the client as 502 with ERR_CONNECT_FAIL.
Cause
Http2ConnectionState::rcv_goaway_frame on master:
this->rx_error_code = {ProxyErrorClass::SSN, static_cast<uint32_t>(goaway.error_code)};
this->session->get_proxy_session()->do_io_close();
- Every stream gets EOS from
Http2Stream::initiating_close. - For a stream still waiting for its response header,
HttpSM::state_read_server_response_headerhandles VC_EVENT_EOS by going tohandle_server_setup_error, thenhandle_post_failurewhen a request body is in flight. - The state ends up
CONNECTION_CLOSED.HttpTransact::is_request_retryablerefuses to retry a non-idempotent method onceserver_request_hdr_bytes > 0, so the client gets a 502.
HTTP/1.1 has no equivalent drain signal, so an HTTP/1.1 POST hit by an abrupt close fails the same way. What's specific to HTTP/2 is that the origin announces it will finish these streams, and ATS throws them away.
Observed
On a 10.0.x build with HTTP/2 to origin enabled. rcv_goaway_frame closes the same way on master.
502 ERR_CONNECT_FAILwith origin status000and zero retries, almost only on POST, PROPFIND, PUT, REPORT and DELETE.- It comes in bursts: 183 requests across several origin sessions ended within the same 100 ms, while other sessions to the same origin kept returning 200.
proxy.process.http2.session_die_defaulttracksproxy.process.http2.goaway_frames_inalmost one-for-one (1,469 / 1,468 on one host). Both counters include client sessions as well as origin sessions.- Over HTTP/2 the sessions are long-lived and heavily multiplexed (thousands of transactions per session), so one drain fails dozens of requests at once.
- A build without HTTP/2 session reuse in the same site and window, where each connection carried only a few requests, had 0 failures where about 5 were expected.
We haven't yet confirmed from a packet capture that every burst was a GOAWAY rather than a TCP close, but the handler behaves as described whichever it was.
Suggested fix
On GOAWAY from an origin:
- Mark the session as draining and take it out of the session pool, so no new streams go on it.
- Reset streams with id >
last_stream_idand make them retryable (they were never processed). - Let streams at or below
last_stream_idrun to completion, and close the session once the active stream count reaches 0 or a drain timeout passes.
The inbound (client) GOAWAY path could follow the same approach.
Related, and may be worth its own issue: ATS keeps opening new streams on an origin session that has answered nothing for many seconds. In the bursts above, sessions silent for about 16 s were still taking new streams until about 300 ms before they closed. A PING-based liveness check would limit how many requests one stalled session can take down.
- Lingua principale
- C++
- Stelle
- 2k
- Fork
- 878
- Merge medio
- 3g 16h
- PR unite (30g)
- 95
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/trafficserver
-
Bug HTTP Support
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
apache/trafficserver#13118 ·
I maintainer di solito rispondono entro 2 giorni
-
header_rewrite: rm-destination after set-destination URL crashes traffic_serverForse già presa @moonchen l’ha presa 7 giorni fa. ApertaBug Crash header_rewrite Plugins
apache/trafficserver#13800 · 1 assegnatario ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
apache/trafficserver#13798 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
apache/trafficserver#13784 ·
I maintainer di solito rispondono entro 2 giorni
-
Plugins
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
apache/trafficserver#13774 ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di apache/trafficserver
Issue simili
-
ai_p2
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
ClickHouse/ClickHouse#125522 ·
I maintainer di solito rispondono entro 1 giorno
-
[BUG] rpicam-still loops forever with "ERROR: Device timeout detected, attempting a restart!!!"Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
raspberrypi/rpicam-apps#934 ·
-
[BUG] The priority slider's keyboard-hints tooltip shows on the 'Default' label, not the sliderApertaagent:WSL bug linux LOW ui
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
I maintainer di solito rispondono entro 1 giorno
-
Branch-3.3.5a
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
TrinityCore/TrinityCore#32060 ·
I maintainer di solito rispondono entro 3 giorni
-
needs-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
open-telemetry/opentelemetry-cpp#4697 ·
I maintainer di solito rispondono entro 1 giorno