Skip to content

test(iouring): judge the SEND_ZC first-completion window under -race, with its detachMu mutant (celeris#587) - #693

Merged
FumingPower3925 merged 10 commits into
mainfrom
test/celeris-587-zc-window-race
Sep 27, 2026
Merged

FumingPower3925 merged 10 commits into
mainfrom
test/celeris-587-zc-window-race

Conversation

@FumingPower3925

@FumingPower3925 FumingPower3925 commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

Closes #587 (on merge). Draft: celeris main is frozen until #674 merges. After #674 this PR needs a rebase onto the new main, a green zc-window run on both arches (the mutant script exits 2 if its anchor drifted, so a drift cannot pass silently), un-drafting and an approving review.

What this does

#587 asks for the io_uring SEND_ZC send state to be judged by the race detector on the interleaving the v1.5.7 audit was about: the SEND_ZC first completion and notification (worker thread, handleSend) against the detached inline-egress guard (dispatch goroutine, the guarded closure). Two things kept that unmeasured:

  1. With a fast reader, loopback never opens the window. The kernel copies on loopback, so the notification follows the first completion in the same batch. feat(iouring): SEND_ZC exposure counters so the race tier and the bench A/B can prove the branch ran #601 measured IouringInlineGuardBlockedZC at 0.
  2. Nothing showed -race watches this path. A clean -race run is evidence only if the same run reports a race once the lock is removed.

Changes:

  • internal/zcwindow (SetHold / Hold / Enabled; round 2 moved them here from the public validation package, whose exported surface is now identical to main). The hold runs right after handleSend returns for a CQE_F_MORE completion: the first completion's writes are done, the deferred unlock has run, and nothing else has been released. It is compiled in only under -tags=validation; in production zcwindow.Enabled is a false constant and both call sites compile away. handleSend itself is unchanged from main.

  • TestSendZCWindowGuardUnderRace (linux && validation). The handler pushes 256 × 64 KiB frames at one per 500 µs, and the client reads one per 4 ms through an 8 KiB receive window, so the handler calls guarded() through every hold. It requires every frame intact and in order, SEND_ZC armed on the detached conn, notifications equal to submits, and the guard declining at least once while a notification was outstanding. An unexposed stream is re-run on a fresh connection, up to 3 attempts, each logged. Round 2: instead of sleeping a fixed 300 ms + 4 × hold before reading the counters, it polls (10 s bound) until every streamed byte is accounted to the inline or ring counter and every submit has its notification.

  • Mutant, .github/scripts/mutant-587-unlock-zc-first-cqe.py: deletes the detachMu acquire in the CQE_F_MORE branch, exits 2 on any source drift.

  • CI job zc-window (x86 and arm64). Each arm runs 3× as separate processes, each with its own log, each judged on its own (round 2; the job tallied one concatenated log per arm, so one racing process plus two failing for another reason would have counted as a kill):

    Arm Required of EVERY one of the 3 processes
    As committed PASS, no race report
    CELERIS_IOURING_SEND_ZC=off PASS, every ZC witness 0, no race report
    Mutant FAIL, with its own WARNING: DATA RACE and race detected during execution of test

    SKIP is forbidden. The job is a check on every PR; it gates merges only if the main ruleset lists it (it does not today: Lint, Unit, Conformance, Driver Conformance, Build ×2, Vulnerability Check).

Evidence

Base dir: evidence/measurements-585-587-588/lane-20260926/ on the lane host.

Round 2 head 9154522:

  • CI run 36295432420, every job green (Lint, Unit, Conformance, Driver Conformance, Build ×2, Vulnerability Check, Adaptive, io_uring init-failure, and zc-window on both arches). The zc-window job's own per-process lines (round2/587/ci-github/):

    Runner Committed (3 processes) ZC off (3) Mutant (3)
    x86 ubuntu-latest, job 108553283717 each PASS, 0 race reports; submits 9, guard_blocked_zc 364-412 each PASS, every ZC witness 0 each FAIL with its own DATA RACE (2, 1, 1 reports) and race detected
    arm64 ubuntu-24.04-arm, job 108553283824 each PASS, 0 race reports; submits 8, guard_blocked_zc 356-358 each PASS, witnesses 0 each FAIL with its own DATA RACE (1, 1, 2 reports) and race detected

    Every stream was exposed on attempt 1 (256/256 frames, about 13.6 MB of 16.8 MB on the ring).

  • Laptop container (round2/587/run-587-r2.sh, linux/arm64 linuxkit, --cpus 4, memlock 128 MiB, 10 runs per arm, one process and one log per run; TALLY.txt from tally-587.sh):

    Arm Result at 9154522 (round2/587/20260927T034933Z-9154522)
    A: committed, hold 2 ms 10/10 PASS, 0 races; submits 8-9, guard_blocked_zc 342-360
    B: committed, hold 0 10/10 PASS, 0 races; guard_blocked_zc 346-410
    C: committed, ZC off 10/10 PASS, every ZC witness 0
    D: mutant, hold 2 ms 10/10 FAIL, each with its own DATA RACE
    E: mutant, ZC off 10/10 PASS, 0 races (attribution: the deleted lock is never reached)
    F: mutant, hold 0 10/10 FAIL, each with its own DATA RACE

    Judged by the CI job's new per-process rule (tally-per-process-587.sh → PER-PROCESS.txt): every one of the 60 processes meets its arm's rule; the 20 mutant processes with the ZC arm reachable each FAIL with their own WARNING: DATA RACE and race detected during execution of test.

  • Hot path (round2/587/hotpath/hotpath-diff-587.sh 9154522, untagged engine/iouring test binary, main 9f4d89b vs 9154522): (*Worker).handleSend, run and processCQE have the same instruction count and an identical mnemonic sequence on both arches (361/1749/237 on amd64, 420/1808/216 on arm64). On amd64 the operands are identical too. On arm64 the only differing instructions are address materialisations -- 1 ADRP + 1 ADD in handleSend, 28 ADRP + 31 ADD in run, none in processCQE (operand-classes.sh → operand-classes.txt): globals moved by the link layout, as at 897b83a. The production engine executes the same instructions as main.

  • Whole-package suites (round2/suites/suites-celeris-r2.sh 9154522, one linux/arm64 container, -race -v, production and -tags=validation, over ./engine/iouring/ ./internal/zcwindow/ ./validation/... ./middleware/websocket/; the base is round 1's 9f4d89b logs, same shape):

    build base 9f4d89b (round-1 logs) this PR 9154522
    production 503 PASS, 0 FAIL, 1 SKIP 503 PASS, 0 FAIL, 1 SKIP
    -tags=validation 504 PASS, 1 FAIL, 1 SKIP 506 PASS, 0 FAIL, 1 SKIP

    0 regressions (round2/suites/celeris-20260927T034934Z/TALLY.txt). The base-only FAIL is TestDriverHTTPZeroOverhead, the io_uring: UnregisterConn then Close leaks the driver socket — the fd-keyed ASYNC_CANCEL misses once the caller has closed the fd, so onClose never fires and the peer never sees EOF #691 area (fixed by fix(iouring): run every driver op through the engine's own duplicate of the socket, and count every cancel until its CQE, so closing after UnregisterConn is safe (celeris#691, celeris#707) #696). The SKIP is TestHubBroadcastFormatsOnce on both trees (alloc counts under -race).

  • Cross-compile: go vet for linux/amd64 and linux/arm64, with and without -tags=validation, over the touched packages: clean. golangci-lint (both tag sets): 0 issues. actionlint: clean.

Round 1 (head 20b1aa5, code-identical in production; kept): CI run 36248124203 green, zc-window x86 3/3 PASS 0 races, ZC-off 3/3 PASS witnesses 0, mutant 3/3 FAIL with DATA RACE (6 reports); arm64 the same (4 reports). Laptop arms A–F at ee19315 10/10 each (587/20260926T134652Z-ee19315/TALLY.txt). The mutant's race report is the audit's feared pairing: the now-unlocked CQE_F_MORE write in handleSend (worker.go:3213) against the guard's read of cs.zcNotifPending (worker.go:2314) through engineWriter.Write from (*Conn).WriteMessage.

The design changes, each driven by a failing run (587/ci-github/): hold at the NOTIF branch plus an echo let the mutant survive one CI run; the echo shape left RingBytes 0 (the hold also stalls inbound delivery); a 1 ms reader carried all 16 MiB inline on the laptop VM.

…with the detachMu mutant as its detector control (celeris#587)

On loopback the kernel copies, so a SEND_ZC's notification lands in the
same completion batch as its first completion and the window in which the
detached inline-egress guard must refuse the raw unix.Write fast path is a
few hundred nanoseconds wide (celeris#601: IouringInlineGuardBlockedZC == 0
on an unmodified build). No test ever put a dispatch-goroutine write inside
it, and nothing showed the race detector watches that path.

validation.SetZCNotifDelay (-tags=validation only; the production stub is
an empty function that inlines to nothing) holds the window open on the
worker thread, lock-free, at the top of handleSend's notification branch.
TestSendZCWindowGuardUnderRace drives a full-duplex 64 KiB echo against a
clamped client receive window and requires: every echo byte-intact and in
order, SEND_ZC armed on the detached conn, notifications == submits, and
the guard declining with a notification outstanding at least once.

The ci.yml zc-window job runs it three ways: as committed (PASS,
race-clean), with CELERIS_IOURING_SEND_ZC=off (PASS, every ZC witness 0),
and against the mutant that deletes the detachMu acquire in the
CQE_F_MORE branch (.github/scripts/mutant-587-unlock-zc-first-cqe.py),
which must FAIL with a DATA RACE report.
@FumingPower3925 FumingPower3925 added this to the v1.6.0 milestone Sep 26, 2026
…on, so the detachMu mutant is caught every run (celeris#587)

CI run 2 of the first version let the mutant survive: 3 ZC submits, 40
guard declines, no DATA RACE. The hold sat at the top of the NOTIF
branch, so whenever the notification landed in a later worker iteration
the worker's per-iteration flush had already taken and released
cs.detachMu between the first completion and the dispatch goroutine's
read -- which orders the two for the race detector with or without the
lock under test (the #587 review's point 2).

The hold now runs immediately after handleSend returns for a CQE_F_MORE
completion, i.e. after the first completion's writes and its deferred
unlock and before the worker releases anything else. It sits at the two
handleSend call sites behind the new validation.Enabled constant, false
in production, so both call sites compile away and handleSend itself is
unchanged from main. The CI job now runs every arm three times as
separate processes (the detector reports a given race once per process)
and requires 3/3 PASS race-clean, 3/3 PASS with ZC off, 3/3 FAIL with a
DATA RACE for the mutant.
…m, not an echo (celeris#587)

CI run 3 (897b83a) showed two nondeterminisms in the echo shape: a run
whose 16 MiB all went out on the inline fast path (RingBytes 0: the
300 us reader drained the socket), and a mutant run with no DATA RACE
(3 ZC sends, 46 guard declines) because the hold also stops the worker
delivering inbound frames, so an echo handler sat in ReadMessage while
the window was open.

The handler now streams 256 x 64 KiB frames at one per 500 us after a
single 'go', and the client reads one per ms: the socket stays congested
(ring sends carry the stream) and the handler calls guarded() through
every hold, independent of the worker's recv processing. Backlog peaks
near 8 MiB, an eighth of the detached send cap.
@FumingPower3925 FumingPower3925 changed the title test(iouring): judge the SEND_ZC first-CQE/NOTIF window under -race, with its detachMu mutant (celeris#587) test(iouring): judge the SEND_ZC first-completion window under -race, with its detachMu mutant (celeris#587) Sep 26, 2026
@coderabbitai

coderabbitai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: goceleris/celeris/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 1e355a55-5476-448f-a64c-05ec791b9598

📥 Commits

Reviewing files that changed from the base of the PR and between 3fe9620 and 1074bfe.

📒 Files selected for processing (7)
  • .github/scripts/mutant-587-unlock-zc-first-cqe.py
  • .github/workflows/ci.yml
  • engine/iouring/worker.go
  • internal/zcwindow/doc.go
  • internal/zcwindow/zcwindow.go
  • internal/zcwindow/zcwindow_off.go
  • middleware/websocket/send_zc_window_race_linux_test.go

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.


📝 Walkthrough

Walkthrough

Adds a validation-only hold between SEND_ZC completion and notification. A Linux WebSocket test checks frame integrity and SEND_ZC witness counters. CI runs the test with the committed implementation, with SEND_ZC disabled, and with a mutant that removes the detachMu acquire.

Changes

SEND_ZC race-window validation

Layer / File(s) Summary
Validation hold and CQE hooks
internal/zcwindow/*, engine/iouring/worker.go
Adds validation and no-op build variants for zcwindow. Both CQE dispatch paths call Hold after handleSend when validation is enabled and the CQE has F_MORE.
WebSocket race-window test
middleware/websocket/send_zc_window_race_linux_test.go
Streams and verifies 256 ordered 64 KiB frames, gathers witness deltas, and checks the enabled and ZC-off cases. The hold defaults to 2 ms and can be disabled with 0.
CI verdicts and lock-removal mutant
.github/scripts/mutant-587-unlock-zc-first-cqe.py, .github/workflows/ci.yml
Runs the test in separate processes on ubuntu-latest and ubuntu-24.04-arm. CI checks the committed and ZC-off arms for clean passes, then requires the mutant arm to report a race and restores worker.go.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Other

Merge Risk: ⚪ Minimal · up to 1074b

No merge-blocking issue is identified in this change. Complete the stated rebase, Docker suites, and CI run before taking it out of draft.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 1074b

The new delay is restricted to validation builds, and ordinary builds retain the existing send synchronization. The proposed CI check is designed to verify that the race detector observes this boundary, but successful runs and required-check status have not been established.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The examined production variant provides no active hold. In validation processes, SetHold controls a duration shared across workers, so a configured delay affects more than one connection, but no external caller for that control was identified.

Trust Boundaries and Controls

  • observed — The examined SEND_ZC state handoff remains protected by detachMu. The validation hold runs outside that lock and does not itself grant a network client authority over the hold duration.

Resilience and Maintainability Implications

  • observed — The test requires an exercised held window and settled SEND_ZC witnesses. The workflow specifies per-process race verdicts and rejects skips, but no passing run is supplied here.

Hardening Proposals

  • proposed — If this race check is intended to enforce the SEND_ZC synchronization guarantee, require its successful runs on both architectures before merge; the workflow alone does not establish required-gate status.
🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR covers the first-completion window and the detachMu race negative control in middleware/websocket/send_zc_window_race_linux_test.go, including frame integrity and ordering checks. The direc… Implement the remaining [#587] race-tier validation. Run the walker across all 64 adaptive-engine cells. Require at least 100 completion-with-pending-write witnesses per cell, and validate the required guarded-call and inline-short-write wi…
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title uses the required Conventional Commit format, identifies the iouring test change, and ends with the issue reference (celeris#587).
Description check ✅ Passed The description directly explains the SEND_ZC race test, mutant control, validation behavior, CI matrix, and reported results.
Out of Scope Changes check ✅ Passed The changed files support [#587]. The internal/zcwindow hold controls the measured completion window. The worker hook exposes that window only for validation builds. The Linux test, mutant script, a…
Full details: Linked Issues check

Explanation

The PR covers the first-completion window and the detachMu race negative control in middleware/websocket/send_zc_window_race_linux_test.go, including frame integrity and ordering checks. The direct requirements in [#587] are broader. The test logs IouringZCCompletionWithPendingWrite but does not require any pending-write witness, does not require 100 such witnesses per cell, and does not exercise the adaptive-engine-aware 64-cell race matrix. The CI job covers only the committed, ZC-off, and detachMu mutant variants on x86 and arm64.

Resolution

Implement the remaining [#587] race-tier validation. Run the walker across all 64 adaptive-engine cells. Require at least 100 completion-with-pending-write witnesses per cell, and validate the required guarded-call and inline-short-write witnesses and ZC structural-zero controls before recording a verdict.

  • Fix all pre-merge checks with AI

Comment @coderabbitai help to get the list of available commands.

…m, so the #587 window is entered on every host (celeris#587)

A 1 ms reader against a 500 us writer does not congest a host whose
500 us sleep takes a millisecond or whose autotuned send buffer is large:
the linuxkit arm64 container carried all 16 MiB inline in 10/10 runs
(RingBytes 0), and 2 of 3 GitHub arm64 runs were under-exposed. The
reader now paces 4 ms per frame (at most a quarter of the write rate,
backlog under ~12 MiB), and a stream that did not reach the ring or did
not show the guard declining is run again on a fresh connection, up to
three attempts, each logged; the race detector watches all of them.
…der a slow reader; the hold makes it host-independent (celeris#587)

The linuxkit arm64 container leg at ee19315 (10 runs per arm) measured
the natural arm (hold 0): the guard declined 238-290 times per stream
and the detachMu mutant FAILED with a DATA RACE 10/10, the write
reported after the guard's read. The comments claimed the worker's
per-iteration flush would always order the two accesses in the natural
window; that is not what was measured, so they now say what was: the
paced stream opens the window on its own on the hosts measured, and the
hold is what makes the detector control independent of the host's
timing. Comment-only.
…c validation package into internal/zcwindow (celeris#587)

validation.Enabled, SetZCWindowHold and ZCWindowHold were exported
no-ops in the published validation package, API for one measurement.
They now live in internal/zcwindow (hold under -tags=validation, a false
Enabled constant otherwise), so validation's public surface is the same
as on main. The test also stops sleeping a fixed 300 ms + 4 x hold before
reading the counters: it polls, with a 10 s bound, until every streamed
byte is accounted to the inline or ring counter and every SEND_ZC submit
has its notification.
…require the mutant's kill in every one to be a race report (celeris#587)

The tally counted "WARNING: DATA RACE" once over an arm's concatenated
log, so a mutant arm with one racing process and two failing for another
reason would have counted as killed. Each process now writes its own log;
a fixed/ZC-off process must PASS with no race report, and a mutant
process must FAIL with its own DATA RACE report and "race detected during
execution of test" line. The job comment describes the paced server push
the test drives (not an echo) and no longer calls the job a standing gate:
it is not in the main ruleset's required checks.
@FumingPower3925

Copy link
Copy Markdown
Contributor Author

Review round 2 (head 9154522, still on main 9f4d89b, which stays frozen until #674). Each finding of the round-1 review, with its outcome and proof. Evidence base dir: evidence/measurements-585-587-588/lane-20260926/round2/ on the lane host.

  1. The CI mutant tally counted WARNING: DATA RACE once over each arm's concatenated log, so one racing process plus two failing for another reason would have counted as killed. Fixed (9154522): each of the 3 processes writes its own log and is judged alone; a mutant process counts as killed only if it FAILs with its own WARNING: DATA RACE and race detected during execution of test; a fixed or ZC-off process must PASS with no race report. CI at 9154522 (run 36295432420): x86 and arm64, every mutant process FAILs with its own race report (x86 2/1/1 reports, arm64 1/1/2), every fixed and ZC-off process PASSes with none.
  2. "Standing gate" overstated what the job enforces (not in the ruleset's required checks). Reworded in ci.yml: a check on every PR, a gate only if the main ruleset lists it. Adding it to the ruleset is a repository-settings change I cannot make.
  3. Nit: the ci.yml comment still described a 64 KiB echo. Fixed: it describes the paced server push the test drives.
  4. Nit: "Refs Measure: exercise the SEND_ZC branch in the race tier (64 KiB WebSocket echo walker) so the v1.5.7 send-state audit is judged by the race detector #587" vs "Measure: exercise the SEND_ZC branch in the race tier (64 KiB WebSocket echo walker) so the v1.5.7 send-state audit is judged by the race detector #587 closes when test(iouring): judge the SEND_ZC first-completion window under -race, with its detachMu mutant (celeris#587) #693 merges". Fixed: the body says Closes #587.
  5. Nit: fixed 300 ms + 4 × hold sleep before notifs == submits. Fixed (9fde059): the test polls (10 s bound) until every streamed byte is accounted to the inline or ring counter and every submit has its notification; on timeout it logs the unsettled counts and the assertions name them.
  6. Nit: validation.Enabled, SetZCWindowHold, ZCWindowHold became exported no-op API in the published validation package. Fixed (9fde059): moved to internal/zcwindow; validation/ is now byte-identical to main. Hot path re-measured at 9154522 (587/hotpath/): handleSend/run/processCQE same instruction counts and mnemonic sequences as main on amd64 and arm64, operands identical on amd64; on arm64 only ADRP/ADD address pairs differ (operand-classes.txt: 2 in handleSend, 59 in run, 0 in processCQE), i.e. link layout.
  7. Nit: after fix(engine): keep serving on a paused listener for 1.5 s with TCP_DEFER_ACCEPT cleared, so a switch or PauseAccept no longer resets clients that had not yet sent a request (celeris#662, #675) #674 the PR needs a rebase and a zc-window re-run on both arches. Agreed; stated at the top of the body as the merge path. Not possible before fix(engine): keep serving on a paused listener for 1.5 s with TCP_DEFER_ACCEPT cleared, so a switch or PauseAccept no longer resets clients that had not yet sent a request (celeris#662, #675) #674 lands.

Laptop container control at 9154522 (587/20260927T034933Z-9154522, 10 runs per arm): fixed/hold 10/10 PASS 0 races, fixed/natural 10/10, ZC off 10/10 witnesses 0, mutant/hold 10/10 FAIL with a race in every process, mutant/ZC off 10/10 PASS 0 races, mutant/natural 10/10 FAIL with a race in every process; the per-process rule holds for 60/60 processes (PER-PROCESS.txt).
Whole-package suites at 9154522 (linux/arm64 container, -race -v): production 503 PASS / 0 FAIL / 1 SKIP (base 503/0/1), -tags=validation 506 / 0 / 1 (base 504 / 1 / 1, the #691 TestDriverHTTPZeroOverhead), 0 regressions.
CI at 9154522: run 36295432420, every job green. No lock is added or changed (the hold is a sleep in a validation-only build; handleSend is untouched).

@FumingPower3925

Copy link
Copy Markdown
Contributor Author

Review round 3 (head 9154522, unchanged; still a draft on the frozen main 9f4d89b). Neither round-2 re-review left an open finding on this PR, so this round changed no code here.

Lane round-3 evidence: evidence/measurements-585-587-588/lane-20260926/round3/MANIFEST.txt (#412 and #411 carry this round's changes).

@FumingPower3925

Copy link
Copy Markdown
Contributor Author

Review round 4 (fix round 3). No open finding on this PR, and the head is unchanged: 9154522, still a draft. CI is 15/15 success.

celeris main moved. The freeze ended when #674 merged at 12:20Z, and #671 and #699 followed. Main is now 9aa94eb, 3 commits past this PR's base 9f4d89b. git merge-tree of this head with main gives a clean tree, with no conflict (evidence/measurements-585-587-588/lane-20260926/round3/fix3/693/behind-main.txt). The rebase was not in this round's scope, so this PR is not rebased yet. It needs the rebase, the Docker suites and a CI run before it can leave draft.

@FumingPower3925
FumingPower3925 marked this pull request as ready for review September 27, 2026 17:25
@codecov

codecov Bot commented Sep 27, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 33.33333% with 4 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
engine/iouring/worker.go 50.00% 2 Missing ⚠️
internal/zcwindow/zcwindow_off.go 0.00% 2 Missing ⚠️

📢 Thoughts on this report? Let us know!

@codspeed

codspeed Bot commented Sep 27, 2026

Copy link
Copy Markdown

Merging this PR will improve performance by 37.5%

⚡ 1 improved benchmark
✅ 64 untouched benchmarks
⏩ 5 skipped benchmarks1

Performance Changes

Benchmark BASE HEAD Efficiency
⚡ 4producers 11 ns 8 ns +37.5%

Tip

Curious why performance improved? Comment @codspeedbot explain why performance improved on this PR, or directly use the CodSpeed MCP with your agent.


Comparing test/celeris-587-zc-window-race (1074bfe) with main (3fe9620)

Open in CodSpeed

Footnotes

  1. 5 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Measure: exercise the SEND_ZC branch in the race tier (64 KiB WebSocket echo walker) so the v1.5.7 send-state audit is judged by the race detector

1 participant