HTTP/2 to origin: GOAWAY closes the session at once and aborts streams at or below last_stream_id
メンテナーはふだん 2 日以内に返信
@bneradt がすでに取り組んでいます。
2026年10月1日 から。
評価
この issue はまだ評価されていません。
説明
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.
- 主要言語
- C++
- スター
- 2k
- フォーク
- 878
- 平均マージ
- 3日 16時間
- マージ済み PR(30日)
- 95
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/trafficserver のほかの issue
-
Bug HTTP Support
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
apache/trafficserver#13118 ·
メンテナーはふだん 2 日以内に返信
-
header_rewrite: rm-destination after set-destination URL crashes traffic_server対応中かも @moonchen が 8 日前に担当しました。 オープンBug Crash header_rewrite Plugins
apache/trafficserver#13800 · 担当者 1 名 ·
メンテナーはふだん 2 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
apache/trafficserver#13798 ·
メンテナーはふだん 2 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
apache/trafficserver#13784 ·
メンテナーはふだん 2 日以内に返信
-
Plugins
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
apache/trafficserver#13774 ·
メンテナーはふだん 2 日以内に返信
apache/trafficserver の issue をすべて見る
似ている issue
-
1 type: problem 2 scope: firmware 3 good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
SpaceTeam/STS1_COBC_SW#511 ·
-
documentation good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
imaaiagent/fumi#3 ·
-
A bare port in --modelserver does not reach the model server対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
rocketride-org/rocketride-server#2618 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug format I/O medium priority rt_lib
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信
-
refactor
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信