From f5ccd640fb03fb355c807179d7f811faf912e091 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 12 Jun 2026 06:58:31 +0000 Subject: [PATCH] =?UTF-8?q?docs(roadmap):=20known=20bug=20=E2=80=94=20HTTP?= =?UTF-8?q?/1.0=20keep-alive=20honored=20but=20not=20advertised?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Found benching with ab -k: a 1.0 request with Connection: Keep-Alive is kept alive (second pipelined request answered on the same socket) but the response never echoes the header. 1.0 clients only reuse on explicit server opt-in, so they wait for EOF that never comes; ab -k deadlocks to apr_pollset_poll timeout on the first response. Recorded with repro, fix direction (echo header in serialise_response on live 1.0 conns, or force-close 1.0), and the no-keep-alive baseline: GET /users, release, loopback, logging silenced, c=50 -> ~18.9k req/s, p50 3ms / p99 5ms, 0 failed. Fix deliberately not started: scope (error responses, HEAD) is a user call. --- ROADMAP.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index fc6db4b..2ec174f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -227,6 +227,24 @@ PubSub underneath. --- +## Known bugs + +- **HTTP/1.0 keep-alive: server honors but never advertises** (found + 2026-06-12 via `ab -k`). A 1.0 request with `Connection: Keep-Alive` + IS kept alive (second pipelined request on the same socket gets + answered), but the response carries no `Connection: Keep-Alive` + header. Per 1.0 convention the client may only reuse when the server + explicitly opts in; absent the header, clients assume the server will + close and wait for EOF โ€” which never comes. `ab -k` therefore + deadlocks until its poll timeout (`apr_pollset_poll: timeout 70007`) + on the FIRST response; no keep-alive bench numbers obtainable. + Fix direction: when the conn stays alive on a 1.0 exchange, echo + `Connection: Keep-Alive` in serialise_response โ€” or don't keep 1.0 + alive at all. Decide scope (error responses, HEAD) with user first. + Baseline for reference: GET /users (crud example, release, loopback, + stdout logging silenced), no keep-alive, c=50: ~18.9k req/s, 0 + failed, p50 3ms / p99 5ms. HTTP/1.1 path responds normally. + ## Later / icebox - **HTTP/2** โ€” spec ยง2.2 already designs the stream-actor demux (zero-copy