Repository navigation
fix(bench): measure receive windows' fitting cells; skip overcommitted ones until group drops - #7838
Conversation
Quest-Claim: 532564dcb180f176
Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
|
Design change: local review rejected the application-level semaphore because it changes the offered concurrency and excludes admission wait from latency. I removed it and restored the original benchmark and its quest. Both sides of PR 7597 reproduce the failure; the comparison at PR 7624 is running. This attempt will hand back a draft with an explicit maintainer choice between measuring intentional overload and changing production admission/scheduling. No policy choice is being made while the maintainer is AFK. (Written by GPT-6.1 Sol) |
Revert application admission after local review because it weakens the measured pressure. Preserve the quest with the reproduced regression boundary and the maintainer decision needed before implementation. Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
Apply the local reviewer suggestion: record why admission is rejected without referring to the current PR diff. Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
…ive-windows-evicted
…mmitted cells Record the maintainer's 2026-11-04 overload policy: keep the offered workload, report delivered frames and evicted streams, and assert zero evictions only for cells whose incomplete units fit the connection window. The benchmark's tracks also set no max age again: #7729's zero default expired superseded in-flight groups at the publisher, so even the default cell timed out. Overcommitted cells still stall on groups the subscriber gives up on without handing them out; the quest records that open decision. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The maintainer chose, 2026-11-04, to report abandoned groups at the source (quest/m1/group-drops.md) over a benchmark give-up timeout or publisher-paced sending. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ive-windows-evicted
… land The maintainer chose, 2026-11-04, to land the cells whose incomplete units fit and to skip the 256-stream, 4 MiB-frame, and follow cells until quest/m1/group-drops.md makes abandoned groups visible to readers. Each skipped cell prints with that reason on stderr, so the nightly report parser keeps reading stdout as the CSV table. The quest now tracks re-enabling those cells. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Design change: the PR no longer only records a policy wait. Per the maintainer's 2026-11-04 decisions, it now implements the overload policy: zero-eviction assertions only for cells whose incomplete units fit, plus (Written by Claude Opus 5.5) |
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 23 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head dec38b16baa4f371378c0700638058c3576f895c against base 7697e2d82073ea12f8222b0b797a047ead329c09. No actionable findings in the fitting-cell assertions, credit accounting, reporting/parser changes, or the documented split.
Verification: GitHub-only static review; I did not run the benchmark or reproduce scheduler behavior. The three overcommitted cells remain intentionally unvalidated until group-drop reporting is available.
(Written by review (OpenAI))
…after the drop set - The Goal promises every abandoned group on moq-lite; moq-transport reports what its wire allows. - The receive-windows benchmark's overcommitted cells decide the wire mechanism. - The public API lands after the drop set reshapes poll_drop, and JS and the bindings mirror it only for a named consumer. - The m0 benchmark quest no longer Requires this m1 quest; #7838 skips those cells and its remainder waits on this as an outside condition. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
ℹ️ Minor suggestions only.
Reviewed changes
- Fit criterion and skips.
Cell::fitscomparesstreams × min(frame, 1 MiB segment)against the connection window, andbenchmark_receive_windowspartitions its cells on it. Fitting cells keep the zero-eviction and full-delivery assertions; the three overcommitted cells print a stderr skip line and wait onquest/m1/group-drops.md. - Eviction accounting.
measurenow treatsError::Evictedfromread_frameas a lost frame instead of panicking, recordscredit.evicted, and only asserts full delivery for cells that fit. - Reporting. The CSV gains
delivered_framesandevicted_streams, andsh/gh/bench-report.pyrecognizes those exact names asframes(bigger is better) andstreams(smaller is better) measurements rather than dimensions. - Max age. Benchmark tracks set
with_max_age(None), undoing #7729's zero default that expired their superseded in-flight groups. - Quest. Rewritten to re-enable the three cells once group drops land, with its own
## Waitingcondition.
ℹ️ bench/README.md no longer lists every measurement column
sh/gh/bench-report.py now treats delivered_frames and evicted_streams as measurements, but bench/README.md:795-799 still says only the time columns, size_bytes/peak_bytes, mib_per_s, and *_packets are measurements and that "every other column is a workload dimension". The new columns contradict that documented contract.
Technical details
# Update the measurement-column contract in bench/README.md
## Affected sites
- `bench/README.md:795-799` — the documented set of measurement columns omits `delivered_frames` and `evicted_streams`.
## Required outcome
- The README's list matches `measurement_unit()` in `sh/gh/bench-report.py`, including the exact-name matches for these two columns.ℹ️ The Nightly quest index still describes the old goal
quest/m0/nightly/README.md:38 still titles this child "The receive-windows benchmark runs to the end" and says it "stops failing frame: Evicted". The rewritten quest's goal is instead that the three overcommitted cells run again later, with the benchmark skipping them until then, so the index contradicts the quest it links to.
Technical details
# Refresh the quest index entry
## Affected sites
- `quest/m0/nightly/README.md:38` — link text and one-line summary describe the pre-rewrite goal.
## Required outcome
- The entry's title and summary match `quest/m0/nightly/receive-windows-evicted.md`'s new H1 and goal.deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Problem
Nightly's
benchmark_receive_windowsfailed, so the wholeRust benchmark testsjob failed and no Nightly report was published.frame: Evicted.with_max_age(None)but missed this ignored benchmark. Each benchmark track keeps up to 1 MiB of groups in flight, so its superseded groups expired at the publisher and never arrived. On main, even the default cell timed out (group timed out).Decisions
All three were settled 2026-11-04 by the maintainer.
Overload policy:
Silent loss:
quest/m1/group-drops.md, planned in moq-dev/moq#7890. There, the wire always names an abandoned group, andtrack::Subscriber's drop signal becomes public.Split:
Changes
Cell::fits:streams × min(frame, 1 MiB storage segment) ≤ connection window. Equal-priority tracks interleave by packet, so each can hold one whole frame, or one segment of a larger frame, before any completes. Cells that fit assert zero evictions and full delivery.measurecounts anEvictedgroup as lost in a cell that doesn't fit, ready for when those cells return.benchmark_receive_windowssplits its cells onCell::fits. Each skipped cell prints with the reasonwaits on quest/m1/group-drops.md. These lines go to stderr, because the Nightly report parser reads every stdout line after the CSV header as a row.delivered_framesandevicted_streams, each the median of the runs.sh/gh/bench-report.pyreads them asframes(bigger is better) andstreams(smaller is better) measurements, not as dimensions. They match by exact name, because other benchmarks print*_framescolumns as workload dimensions. Existing series names are unchanged, and the parser test covers both columns.## Waitingoutside condition. It records all three decisions.Why the overcommitted cells wait
Each track paces itself on the groups its reader resolves, either delivered or
Evicted. In overcommitted cells the subscriber also abandons some groups withoutrecv_groupever returning them:fetch abandoned).Such a group's in-flight permit never returns, so the writer stalls and the reader times out. The 4 MiB-frame cell hit this on every run, and the 256-stream cell intermittently. Once group-drops lands, the reader returns a dropped group's permit and counts the group as lost.
Evidence
Final sweep on this head (medians of three runs):
Regression boundary (unchanged benchmark, through
quest gate):frame: Evictedin the 4 MiB-frame case; 42.7 sgroup timed outin the default cellAn earlier attempt added a connection-wide admission semaphore. It was rejected: it changes the measured pressure and leaves admission wait out of frame latency.
Impact
Validation
quest gate just rs test -p moq-tokio --test integration --release -E 'test(benchmark_receive_windows)' --run-ignored only --success-output immediate: PASS in 24.3 s, output above.bench-report.py'sprinted()andchecked(): 70 measurements, unitsMiB/s,bytes,frames,ms,packets,streams.python3 sh/gh/bench-report.test.py: 15 tests OK.cargo clippy --locked -p moq-tokio --tests -- -D warnings,cargo fmt --all --check,git diff --check: pass.quest check --base origin/main, with quest freshly built from the merged checkout's pin: 608 documents ok.Review
Codex via
quest review --base origin/main --new, gpt-6.1-sol, medium effort, session01a1a785-1b2b-79d2-a2f2-d64aaa8a5f0b. Round 1 at dec38b16ba: no findings.Earlier rounds, by Claude Code, covered only the quest-only version of this PR. The approach changed since, as recorded in a
Design change:comment.Follow-ups
## Requirededge from this quest toquest/m1/group-drops.md. This branch's quest file ends with## Waitingwhere quest: report every group a subscriber gives up on #7890 appends## Required, so a later merge keeps both sections.(Written by Claude Opus 5.5)