Repository navigation
Conversation
vanilla-ws was the same epoll engine with only a /ws route, so it ran as a separate entry. vanilla-epoll now serves GET /ws on its :8080 listener: the handler validates the RFC 6455 upgrade, appends the 101 and hands the connection over (core.queue_takeover). After that, every readable burst goes to a ConnHandler that walks the frames (echo text/binary, ping -> pong, close handshake). echo-ws, echo-ws-pipeline and echo-ws-limited move to vanilla-epoll's meta.json. The vanilla-ws directory, its results file and its eight container logs are removed. The vanilla pin moves from 091c014 to 3dd5a79 in vanilla-epoll and vanilla-io_uring. The seven commits in between are enghitalo/vanilla#208 (the websocket accept key computed on the stack) plus docs and CI. Before MDA2AV#208, crypto.sha1 leaked ~820 B per upgrade under -gc none, which is what pushed vanilla-ws to 0.4-1.2 GiB on echo-ws-limited. vanilla-io_uring keeps main.v identical to vanilla-epoll's, so it gets the same /ws code. vanilla's io_uring backend cannot take connections over yet: queue_takeover returns false there and /ws answers 501. vanilla-io_uring does not subscribe the echo-ws profiles until the library supports it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
enghitalo
requested review from
Kaliumhexacyanoferrat and
MDA2AV
as code owners
October 10, 2026 03:32
Contributor
Author
|
/benchmark-multiple -f vanilla-epoll |
Contributor
|
👋 Benchmark request received. A collaborator will review and approve the run. |
vanilla-h2c was the same epoll engine with the http2 module behind the conn-mode seam. vanilla-epoll now does that itself, on two listeners: - a third listener on :8082 that speaks only h2c. The PRI * preface hands the connection to the http2 machine (core.queue_takeover) and appends the server SETTINGS. Any HTTP/1.1 request there gets 505, so the h2c profiles can't measure h1. - the :8080 handler, which takes the same preface for unary-grpc. GetSum answers with HEADERS, the SumReply as DATA, then grpc-status 0 as trailers. /json over h2c reuses the entry's precomputed prefixes: the body writer is split out of write_json_into. baseline-h2c, json-h2c and unary-grpc move to vanilla-epoll's meta.json. The vanilla-h2c directory, its results file, its container logs and its frameworks.json entry are removed. The http2 code did not change between the old pin (091c014) and 3dd5a79. vanilla-io_uring keeps the same code but starts no :8082 listener: its backend cannot take connections over (enghitalo/vanilla#267), so the preface on :8080 gets 501. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Touching validate.sh makes CI validate every framework, not just the changed ones. Keeping a stale vanilla-h2c mention in a comment is cheaper than that. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
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.
vanilla-ws and vanilla-h2c ran the same epoll engine as vanilla-epoll. Each only handed the connection, after an HTTP/1.1 head, to a different protocol machine through vanilla's conn-mode seam (
core.queue_takeover+ aConnHandler). This PR moves both into vanilla-epoll and removes the two separate entries.Changes
WebSocket (echo-ws, echo-ws-pipeline, echo-ws-limited), on
:8080GET /wsvalidates the RFC 6455 upgrade, appends the101and takes the connection over.h2c (baseline-h2c, json-h2c), on a new h2c-only listener on
:8082PRI *connection preface parses as an ordinary request. The handler hands the connection to vanilla'shttp2module and appends the server SETTINGS.:8082gets505, never a200, so the profile can't measure h1./jsonreuses the entry's precomputed prefixes. The body writer is split out ofwrite_json_into.unary-grpc, on
:8080:8080handler takes the samePRI *preface.GetSumanswers with HEADERS, then theSumReplyas DATA, thengrpc-status: 0as trailers.Removed: the
vanilla-wsandvanilla-h2cdirectories, theirsite/data/results/*.jsonfiles, their container logs and theirframeworks.jsonentries.scripts/validate.shstill mentions vanilla-h2c in a comment; editing it would make CI validate every framework.vanilla pin:
091c014→3dd5a79, in vanilla-epoll and vanilla-io_uring. The 7 commits in between are enghitalo/vanilla#208 plus docs and CI;http2is unchanged.crypto.sha1leaked about 820 B per upgrade under-gc none. That is what pushed vanilla-ws to between 0.4 and 1.2 GiB onecho-ws-limited.vanilla-io_uring:
main.vin step with vanilla-epoll's, so it carries the/wsand h2c code.:8080,/wsand thePRIpreface get501, and no:8082listener is started.site/leaderboard/data.jsis left to the next benchmark-results commit. Regenerating it from this branch also pulls in unrelated changes from other entries, because the committed copy is behindsite/data.Known, unchanged from vanilla-h2c: each h2c connection allocates its http2 state once and never frees it (
-gc none; the engine has no close hook for takeover state).Testing (local)
WebSocket
scripts/validate-ws.py: 7 passed, 0 failed.h2c and gRPC — the same checks
validate.shruns, all 17 passed::8082./baseline2with fixed and random inputs, and itscontent-type./jsoncontent-type, and four(count, m)pairs compared againstdata/dataset.json.:8082gets505.GetSumwith two random pairs: HTTP/2,grpc-status: 0, correct sum.h2load, with the harness's shapes and
nofilelimit; 0 failed, all 2xx:-mHTTP/1.1, unchanged:
/baseline11(GET and POST),/json,/pipeline,/static, the 404s, and TLS/jsonon:8081./wson the TLS listener returns 404.vanilla-io_uring: the image builds and serves
/baseline11. ThePRIpreface and the/wsupgrade on:8080get501.🤖 Generated with Claude Code