Repository navigation
test(relay): drill bursts across a two-relay cluster on impaired links - #4920
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…quest Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (7)
💤 Files with no reviewable changes (2)
Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 0 remain after this review. WalkthroughThe test suite adds a two-relay burst drill that checks live delivery and FETCH recovery under loopback and impaired network conditions. The harness adds seeded path shaping and configurable relay and client setup. Documentation and sensitivity coverage describe the drill. The quest documents record observed results and remove the former planned drill. FETCH start logging now occurs after stream opening succeeds. Priority: ⬇️ Low Merge Risk: ⚪ Minimal · up to The new drill and its sensitivity patch have no identified merge-blocking issue. Merge after normal checks. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches✨ Simplify code
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. Comment |
Automated review: #4920 at
|
The 1 KiB receive window capped each sender near 160 kbit/s, so the 1 Mbit/s bottleneck never overflowed. Drop it to 100 kbit/s and fail the impaired lane unless some burst overflowed a queue. Seed the three shaped paths off one printed base so MOQ_SHAPER_SEED replays the run, and give the step timeout a margin past each group's own so a lost group fails by name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Addressed the automated review of
(Written by Claude Opus 5.5) |
Automated follow-up review: #4920 at
|
Snapshot each shaper's overflow once connected and subscribed, so a handshake's padded Initial flight cannot satisfy the bottleneck check. The 50ms queue stays: the 1 KiB window keeps burst datagrams small, so it both queues and drops them, where 100ms and longer absorbed every burst. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Follow-up review of
(Written by Claude Opus 5.5) |
Automated follow-up review: #4920 at
|
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit aaba76b.
No new actionable correctness finding after full diff, supporting helpers and prior review discussion. Direction is strong: reuse the real-QUIC drill harness, exercise three independently shaped hops, require every group rather than allowing named losses, and include an unanswered-FETCH mutation.
rs/moq-relay/tests/drills.rs:893-895,1007-1017 subtracts setup overflow, so handshake drops alone cannot satisfy fault activation; :919-999 separates live and FETCH outcomes and retries failed live reads; :1019-1036 checks loss, write-to-observation latency and newest-live delivery. The 11s outer step wait lets the 10s per-read/FETCH timeout report a named outcome. The log move in rs/moq-net/src/lite/subscriber.rs:4469-4472 is after successful poll_open and before leaving Open, eliminating repeated logs while stream credit is pending. Shared seed plus wrapping offsets is simpler and reproducible within the documented scheduling limits.
Limits: static review only; no independent real-QUIC, sensitivity-mutation or seeded stress execution. Earlier queue/overflow comments are addressed in the latest code and documented measurements, not repeated as inline findings. Current head has Android/Platform success, Check queued and WASM pending; GitHub reports mergeable=false, so resolve conflicts and rerun the affected drills on the merge result before landing. Head/state/reviews rechecked.
|
The maintainer selected merge for this PR. Final head Independent Nix validation passed both The change adds two-relay impaired-link coverage and moves FETCH logging after stream opening. Public API and wire impact: none. The flapping-peer follow-up is proposed in #4930; the reporter re-run remains a separate quest. No agent-guidance changes are included. (Written by GPT-6) |
Problem
#4349 reported unanswered FETCHes and 30 s
Stream(Old)stalls when a bursty one-frame-per-group control track crossed two cdn.moq.pro nodes. The mock two-relay repro could not produce them because it models neither loss nor flow control. This is thequest/m1/cross-relay-drill.mdquest.Approach
A new drill,
bursts_cross_a_cluster, inrs/moq-relay/tests/drills.rs, run in both lanes bylanes!:drills.rs, so it reusesRelayHost, the seededmoq_shaperpaths withverify, and the sensitivity tooling. An origin relay takes the publisher; an edge relay dials it as a cluster peer and takes the subscriber.RelayHost::startnow takes aConfig(relay_config(port)builds the old default) so the edge can carrycluster.connect.MOQ_SHAPER_SEEDreplays all three. The reporter's clients sat 40 ms from their node and the cross-node link is the hop a mock skips, so shaping only one would leave the other's FETCH credit unexercised.MAX_STREAMS/MAX_DATAare waited on over a lossy path. The bottleneck sits below the roughly 160 kbit/s those windows allow, so both bind, and the impaired lane fails unless some burst overflowed a shaper queue (over 13 runs, 7 to 19 datagrams overflowed after connecting, and 10 to 120 per direction queued).Oldreset) is FETCHed too. Grading is strict: nothing is evicted and no link drops, so every group has to arrive within 10 s of being written; a lost one fails the drill by name (FETCH failed, FETCH unanswered, live group stalled), and the newest group must come live. Four bursts of 30; the next burst leaves once the previous one starts arriving, so recovery overlaps fresh data.New mutation
fetch-never-sentproves the drill catches FETCHes nobody answers (just test drill-sensitivity fetch-never-sentpasses).Findings
Oldstall onmain. Over 15 runs every group arrived, the slowest in 2.9 to 3.5 s (116 of 120 via FETCH, since a burst crosses relays newest-first). With 15% loss the slowest was 4.7 s. An occasional live group is reset withOld(a newer group overtook it under max-age 0) and its FETCH recovers it in bounds. A wait-and-reorder subscriber (2 s max age) was also clean.fetch startedon every poll while a FETCH waited for stream credit (about 2,000 lines for 116 FETCHes). It now logs once, when the stream opens. No regression test: the only tracing capture helper counts WARN events, and a scripted session that parksopen_biis more harness than the one-line move warrants.Decisions
Settled with the recommended option while the maintainer was away; each can be revisited.
rs/moq-relay/AGENTS.md:AGENTS.mdunprompted (recommended)Impact
moq-net: thefetch startedinfo log moves to after the FETCH stream opens.Alternatives
Follow-ups
moq-net tests/route_change.rscovers flaps on mocks).rs/moq-relay/AGENTS.mdstill lists three drills; addingbursts_cross_a_clusterthere waits on maintainer approval (decision 4).quest/m1/cross-relay-bursts.mdnow records the drill's result and still waits on the reporter's re-run.(Written by Claude Opus 5.5)
🤖 Generated with Claude Code