Repository navigation
fix(net): a capped IETF stream never claims END_OF_GROUP - #5077
Conversation
|
Quest outcome: implemented as scoped, in Rust and JS, with regression tests that fail without the fix. Suggested follow-up quests:
(Written by Claude Opus 5.5) |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A subgroup stream cut short by the subscription's end Location set the END_OF_GROUP header bit, so a subscriber inferred the group ended at the cap. Clear it whenever the range caps the group, in Rust and JS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
41d78c1 to
5d9c327
Compare
|
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 20 minutes. View limit detailsLimit details: You’ve used all 4 included reviews currently available. Review configuration: ⚙️ Run configuration
📒 Files selected for processing (5)
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (1)
💤 Files with no reviewable changes (1)
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 JavaScript publisher sets Priority: ➖ Normal Merge Risk: ⚪ Minimal · up to No concrete issue remains that would block merging after normal checks. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)✅ Passed checks (4 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 |
|
Grok review of Small, correct fix: the subgroup header now sets END_OF_GROUP only when the slice has no No blocking issues. Non-blocking:
Verdict: MERGE (once CI is green) This is an automated review, not the maintainer's decision |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Grok review of The fix is small and correct. Both publishers now set END_OF_GROUP only when the slice has no Non-blocking
This is an automated review, not the maintainer's decision |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed the full five-file diff at bd6f516214e8f534a2c7ee392d71cd4574ac400b against base a749c1aecd2e85c6391732e953c9f0ef245fcb73.
No actionable findings introduced by this PR. The direction is sound: Rust and JS derive END_OF_GROUP from the same explicit object cap, preserving the bit for uncapped groups and avoiding a false claim even when the cap happens to reach the real end. This is the simplest safe choice before the header is sent; no public API or wire-format change is needed.
I traced the inclusive-to-exclusive bounds, flag encoding, stream completion, and the capped/uncapped regression assertions. The original false END_OF_GROUP claim is fixed. The documented END_OF_TRACK placement/header and backwards-range differences remain pre-existing follow-ups. This independently agrees with the core conclusion of the existing review; no duplicate inline comments.
Verification: GitHub-only static review; I did not run tests. At publication, Check and Test are still queued, so this is not a claim that CI passed.
(Written by OpenAI)
|
Merge summary:
Enabling auto-merge on (Written by Claude Opus 5.5) |
# Conflicts: # quest/m0/README.md
|
Merged Auto-merge is pinned to (Written by Claude Opus 5.5) |
|
Grok review of This is a small, focused fix. Rust ( Blocking: none. Non-blocking
Verdict: MERGE (once CI is green) This is an automated review, not the maintainer's decision |
# Conflicts: # quest/m0/README.md
fix(net): a capped IETF stream never claims END_OF_GROUP (backport #5077)
Conflicts are release backports whose originals are already on main (#4840, #4892, #4710, #5077) and release's noq 1.3.5 pins (#5170); resolved to main's side. Ports the two release-only test additions from the backport reviews: a_parked_read_watches_its_edge_abort, which passes on main's reworked expiry path, and the capped-group END_OF_GROUP asserts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Backport to release. The Rust regression test decodes the header with release's GroupHeader::decode form and runs under tokio::test, since release lacks coding::decode_buf and moq_net_sim. Quest edits dropped. (cherry picked from commit 9680ca9) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Problem
A subgroup stream cut short by the subscription's end Location set the END_OF_GROUP bit in its header, so a subscriber inferred the group ended at the cap even though objects past it exist. Found in Fastly's follow-up on #5020 (
status-end-of-trackandpublish-donecells, d18 and d21).Approach
rs/moq-net/src/ietf/publisher.rs): the subscription's group header setshas_endonly whenGroupSlice::untilis unset.js/net/src/ietf/publisher.ts): the matching header setshasEndonly whenslice.untilis unset.The header goes out before we know whether the group has objects past the cap, so any capped stream clears the bit. A FIN without END_OF_GROUP claims nothing about the group, which is always true.
Tests:
capped_group_does_not_claim_its_endin Rust; the JSreadGrouphelper now reportsendOfGroup, so every slice test asserts the bit, with the absolute-filter test covering a capped tail. Both fail without the fix.just check(exceptmoq-uring, which fails locally on a sharedRLIMIT_MEMLOCK, unrelated) andjust test interop --allpass.Completes and deletes
quest/m0/ietf-end-of-track-location.md.Impact
Alternatives
Follow-ups
write_end_of_trackstream header usesGroupFlags::default()(END_OF_GROUP set) while JS clears it; worth aligning.🤖 Generated with Claude Code
(Written by Claude Opus 5.5)