Reintroduce progressive HTTP read timeout support - #3469
Conversation
Co-authored-by: zchuango <zchuang185@gmail.com>
|
@wwbmmm @chenBright Please carefully review this feature. We have conducted multiple rounds of tests both online and offline, and no abnormal issues have been found. For details, see the following test screenshots and evidence. Additional validation evidence for commit Local stress testing
The attached archive contains:
Archive: progressive-read-timeout-test-evidence-fc865456.zip Archive SHA256:
GitHub Actions rerunsFive of six complete Linux workflow attempts passed. Attempt #5 failed only in the existing The other 10 Linux jobs in that attempt passed. This PR does not modify RDMA Validation ScreenshotsGitHub Actions attempt #6: all Linux jobs passed
|
There was a problem hiding this comment.
Pull request overview
Reintroduces progressive HTTP/1.x response read idle-timeout support for Controller::ReadProgressiveAttachmentBy() by wiring the response socket identity through the HTTP protocol path and adding a synchronized watchdog timer that can fail the underlying socket when the progressive body stream becomes idle.
Changes:
- Add a new client-side
ControllerAPI (set_progressive_read_timeout_ms) and internal timeout reader wrapper that monitors idle gaps between progressive body parts and fails the socket on timeout. - Propagate the underlying HTTP socket id into the controller/RPA path so the watchdog can address and fail the correct connection.
- Add unit tests and update the HTTP C++ examples to demonstrate/validate progressive read timeout behavior (including unsupported HTTP/2 behavior).
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| test/brpc_http_rpc_protocol_unittest.cpp | Adds progressive-read timeout focused tests and test helpers for controlled streaming/reading behavior. |
| src/brpc/policy/http_rpc_protocol.h | Extends HttpContext to retain the socket id used for progressive reads. |
| src/brpc/policy/http_rpc_protocol.cpp | Sets the HttpContext socket id during parsing and forwards it into the controller’s progressive attachment setup. |
| src/brpc/errno.proto | Adds EPROGREADTIMEOUT errno for progressive read idle timeout. |
| src/brpc/details/controller_private_accessor.h | Adds an accessor overload to store the progressive-read socket id alongside _rpa. |
| src/brpc/controller.h | Exposes set_progressive_read_timeout_ms() API and stores timeout/socket-id fields in Controller. |
| src/brpc/controller.cpp | Implements timeout watchdog state/task + wrapper reader, errno registration, and hooks timeout handling into ReadProgressiveAttachmentBy(). |
| example/http_c++/http_server.cpp | Adds a flag path to simulate a stall mid-progressive response for timeout demonstration. |
| example/http_c++/http_client.cpp | Adds optional progressive read mode and timeout flag, then reads response progressively with a reader callback. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
|
@wwbmmm @chenBright The Copilot review comments have been addressed and all CI checks have passed on the latest commit Could you please take another look when convenient? |



What problem does this PR solve?
Issue Number: Related to #3133, follow-up pr #3409 and #3453
Problem Summary:
Progressive HTTP response reads currently have no independent idle timeout after
ReadProgressiveAttachmentBy()is called. A reader may therefore wait indefinitely when the peer stops sending body data while keeping the connection open.PR #3409 introduced progressive-read timeout support, but post-merge CI exposed a lifecycle and synchronization problem around the timer callback and reader completion path. In particular, the timer callback could race with reader completion/error delivery, which made
HttpTest.progressive_read_timeout_preserves_reader_errorunstable and could replace the reader's original error with the timeout status.This PR restores the feature with explicit synchronization and independent timer-state ownership.
What is changed and the side effects?
Changed:
Side effects:
Performance effects:
Breaking backward compatibility:
Check List: