Repository navigation
Conversation
Quest-Claim: 785fb253d4b19f2f
Preserve failing relay regressions and passing source-end controls while documenting the unresolved stream completion signal. Co-Authored-By: GPT-6 <codex@openai.com>
Include lite06 in the unresolved completion-signal compatibility scope. Co-Authored-By: GPT-6 <codex@openai.com>
|
Maintainer decision: park. Leave bounded tails unsupported for now; this draft stays as the checkpoint and the quest keeps the Goal. Do not pursue either wire option until the quest is picked up again. (Written by Claude Opus 5.5) |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A lite-07 Group Stream capped at a subscription's end frame now says so with `Frame End`. A FIN there suspends the receiver's cached copy instead of finishing it, and the publisher serves the rest on a later Group Stream once SUBSCRIBE_UPDATE moves the end past it, so a relay's copy cut for one request accepts the tail another request asks for. Lite-06 and moq-transport continuations move to their own quests. 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 25 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. Comment |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a71e15165b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| let Some(capped) = self.capped.take() else { | ||
| return; | ||
| }; |
There was a problem hiding this comment.
Reapply updates to continuations still waiting to open
If two widening SUBSCRIBE_UPDATEs arrive before the capped stream releases its reader, the first moves self.capped into self.tail, and the second returns here without updating that queued tail's frame bounds. For example, widening an exclusive end from 2 to 4 and then 6 leaves the tail capped at 4, while serve() derives its GROUP Frame End from the latest end, 6. Its FIN at 4 then falsely declares the source group complete, losing subsequent frames. Update or reposition the queued tail under the latest bounds before opening its stream.
Useful? React with 👍 / 👎.
| groups.retain(|held| held.is_suspended() && !held.is_clone(&group)); | ||
| groups.push(group); |
There was a problem hiding this comment.
Release suspended handles after their groups are aborted
On a long-lived subscription receiving successive capped groups, evicted or expired groups remain in this vector indefinitely: is_suspended() only reads the suspended flag, and neither commit_abort() nor release() clears it. Each new capped group therefore retains all previously aborted handles and scans them again, causing unbounded retained state and quadratic cumulative work even after the cache releases their payloads. Prune terminal groups as well as resumed ones so cache eviction actually releases this ownership, consistent with the parked-clone rule in rs/AGENTS.md.
AGENTS.md reference: rs/AGENTS.md:L15-L15
Useful? React with 👍 / 👎.
|
Closing as superseded by moq-dev/moq#6465, which made every range and fetch start at a group's first frame and deleted The remaining gap, a third-party lite-07 peer widening a mid-group Frame End on one hop, can FETCH the tail; it doesn't justify GROUP Frame End plus the continuation and suspend/resume machinery. The follow-up quests this branch would have added ( (Written by Claude Opus 5.5) |
Problem
Through one relay, subscriber A reads group 5 frames 0..3, then subscriber B asks for 3..5. The stream serving A stops at A's end frame, its FIN falsely completes the relay's cached group, and B never gets frames 3 and 4. The publisher half was missing too: a lite publisher marked a capped group served and moved its cursor past it, so a widening SUBSCRIBE_UPDATE never reached the tail even on one hop, and the lite draft forbade a second Group Stream for a sequence on one subscription.
Approach
Lite-07 end to end (PR 1 of the split below).
drafts/draft-lcurley-moq-lite.md): GROUP gainsFrame Endon lite-07, exclusive and encoded like SUBSCRIBE's (0 = runs to the end of the group). A FIN before it ends the group; a FIN at it ends only the stream. When SUBSCRIBE_UPDATE moves the end past such a group, the publisher continues it on a new Group Stream whoseFrame Startis the earlier stream'sFrame End, amending the one-Group-Stream rule for that case only.Frame Endat or belowFrame Start, or a FRAME at or past it, is malformed.rs/moq-net/src/model):group::Producer::suspendstops writing without ending the group; the copy keeps its write permission so readers wait past the last frame.track::Producer::poll_resume_grouphands that permission to the stream continuing the group, waiting first for a stream it overtook. Allpub(crate), marked// private: capability gap.Frame Endsuspends the copy; a continuation appends to it (plain and compressed), reads and discards a replayed prefix, and refuses a FRAME past its end. A suspended copy is aborted withCancelonce its subscription and streams are gone, so no reader waits on a continuation that cannot come. An evicted copy is fetched anew.js/net): a stream capped at the subscription's end is labelled withFrame Endunless the group is already known to end by then. When an update moves the end past it, the tail is served on a new stream, which opens only after the capped stream wrote its FIN so the receiver never sees a continuation overtake the stream it continues. JS subscribers never request frame bounds, so they reject aFrame Endas unrequested.Decisions
Maintainer, 2026-10-23:
Frame End(exclusive, 0 = to the group end; FIN below it ends the group, FIN at it ends only the stream; a later Group Stream serves the tail after widening).has_end/ END_OF_GROUP with no new wire, in IETF bounded tails.js/net.has_endplus Object-ID/ordinal handling [M], each on this PR's append path.Picked without a prompt (challenge if wrong):
// private: capability gap: a custom subscriber cannot continue a cut copy until resuming goes public. No quest tracks making it public yet.ietfextension records is refused asDuplicate; the IETF quest owns Object-ID continuity.Impact
liteis private in Rust and unexported from@moq/net; the model additions arepub(crate).Frame End; a second Group Stream per sequence is allowed only to continue one that stopped at itsFrame End. Lite-01..06 and moq-transport unchanged. Migration: none.Validation
rs/moq-net/tests/integration/bounded_tail.rs(mock time): plain and compressed relayed tails, local readers, early and exact real ends, repeated widening, and a tail after the subscription ended.Frame End, a continuation overtaking the stream it continues, replayed prefix not written twice, a replay ending early, a frame pastFrame End, an evicted copy, and teardown with the subscription. Publisher tests in Rust and JS cover labelling and continuation; codec tests cover lite-07-only encoding.just checkpassed except onemoq-uringallocation test that hit the sharedRLIMIT_MEMLOCK;just rs test --workspacethen passed 9853/9853.just drafts checkpassed.just test interop --allpassed (172 cases) after merging main; the run before the merge had onerust -> js-native-nodeaudio timestamp gap on a Rust publisher and JS subscriber, a path this change does not alter (no subscriber there requests a frame bound).Follow-ups
(Written by Claude Opus 5.5)
🤖 Generated with Claude Code