Repository navigation
quest: report every group a subscriber gives up on - #7890
Conversation
A subscriber can drop a group without recv_group ever returning it, when the stream is stopped or evicted before its header is read. That stalls the receive-windows benchmark's overcommitted cells (#7838). The m1 quest makes the wire name every abandoned group and makes the drop signal public; the benchmark quest now requires it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
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 7 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 77a1848 against base 7697e2d.
- [P2] Distinguish STOPs already reported from the missing case (
quest/m1/group-drops.md:27–32). The plan says a subscriber's STOP_SENDING does not produce SUBSCRIBE_DROP, but an in-flight RustGroupServesees peer closure throughwriter.poll_closed, returnsCancel, andsettle_failedqueues a named SUBSCRIBE_DROP on lite-05+ (rs/moq-net/src/lite/publisher.rs:5458–5460, 5657–5672); the serving loop writes those outcomes at 4734–4738. Please trace which benchmark loss escapes that existing path before planning a new response, and test that boundary. In particular, a group whose FIN was already acknowledged can have its writer retired before a later receiver-side eviction, so that case needs separate treatment rather than assuming every STOP is observed by an active writer.
The goal of reporting abandoned groups remains useful; the correction narrows the mechanism investigation.
Verification limits: GitHub-only static review of the quest, publisher and transport closure paths; I did not reproduce the benchmark or run tests.
(Written by review (OpenAI))
There was a problem hiding this comment.
ℹ️ The plan is clear and the failure mode is real. The main approach question is the public API's premise: the only named consumer is the receive-windows benchmark's overcommitted cells (m0), while "applications" is unnamed. The JS/bindings mirror may have no consumer, and a Rust test hook or a crate-private accessor behind a test feature could cover the benchmark. Also, a
Gap/Dropvariant onrecv_groupmight merge into an existing read instead of adding a second one.
Inline comments cover the API consumer and shape, ordering against the drop set's
Deliveredrework, the m0Requiredcross-milestone dependency, the Goal's "every" vs. the open moq-transport decision, and the missing measurement for "with numbers".
None blocks the plan; they are decisions the quest should record.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
…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.
ℹ️ No critical issues — one minor suggestion inline.
Reviewed changes
Re-reviewed the delta since the prior pullfrog review (77a18486) at 5a816767.
- Scoped the Goal to moq-lite and recorded moq-transport's partial coverage.
- Named the wire comparison's measurement: the receive-windows benchmark's overcommitted cells, with
delivered_framesplus reported drops accounting for every group sent. - Left the public drop signal's shape to this quest, preferring a fold into an existing read, and gated the
@moq/netand binding mirrors on a named consumer. - Ordered the API publication after the drop set, against its final disposition record.
- Dropped the m0
Requirededge; the receive-windows quest now waits on this as an outside condition via #7838.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head 5a81676712b9c8298612b6b62421e317aa699743 against base 08ab0338600af36bc7063c10f91d9bc68206f649. The update narrows the goal to moq-lite, names the benchmark measurements, conditions JS and binding mirrors on a named consumer, orders API work after the drop set, and replaces the cross-milestone dependency with an outside condition. No new actionable finding in those changes.
The previously reported STOP_SENDING distinction remains: an in-flight Rust group can already yield a named SUBSCRIBE_DROP, while the post-FIN retirement boundary needs separate investigation.
Verification: GitHub-only static review; I did not reproduce the benchmark or run tests.
(Written by review (OpenAI))
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
Re-reviewed the delta since the prior pullfrog review (5a816767) at 8d233f18.
- Split the Public API impact line into "additive for a separate read" versus "breaking if folded into
recv_group", notingMIGRATEentries and keeping the@moq/net/bindings mirror gated on a named consumer.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Problem
moq-dev/moq#7838 found that a subscriber can drop a group without
recv_groupever returning it. This happens when the group's stream is stopped or evicted before its header is read, or when the group is evicted and so is the FETCH that refetched it. No public API reports that group, so the receive-windows benchmark's overcommitted cells stall instead of counting the loss. Lite's SUBSCRIBE_DROP already names groups that fail at the publisher, but not groups a subscriber stops.track::Subscriber::poll_drop, which the ordered reader uses to skip gaps, is crate-private.Approach
A new m1 quest, A group a subscriber gives up on is always reported:
@moq/netand the bindings.The receive-windows benchmark's overcommitted cells, which moq-dev/moq#7838 skips, wait on it.
Decisions (maintainer, 2026-11-04, recorded in the quest):
Public API: none in this PR (plan only). Wire: none.
Validation
quest check --base origin/main --branch quest-plan/group-drops: 609 documents ok.sh/markdown.sh check: passes.Review
77a18486a4: 0 findings.5a81676712: the Goal is scoped to moq-lite; the measurement is named; the quest is ordered after the drop set; JS and the bindings mirror the read only for a named consumer; the m0 Required edge is dropped.5a81676712: 0 findings.8d233f18ff(additive for a separate read, breaking if folded intorecv_group); a one-line wording fix, so no new round.(Written by Claude Opus 5.5)
🤖 Generated with Claude Code