Repository navigation
quest(m1): plan FETCH_OK whole-group and IETF SUBSCRIBE pause - #6272
Conversation
|
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 43 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: 5980e127c7
ℹ️ 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".
| not exist. A FETCH ending at `{2^64-1, 0}` gets the NOT_SUPPORTED that other | ||
| multi-group ranges get, on every draft. |
There was a problem hiding this comment.
Restrict the overflow case to drafts that can encode it
Drafts 14–16 use QUIC varints capped at 2^62-1 (rs/moq-net/src/coding/varint.rs), so a peer cannot send {u64::MAX, 0} on those drafts and the proposed every-draft test cannot reach NOT_SUPPORTED. Refusing each draft's maximum instead would also be wrong for 14–16 because adding one to 2^62-1 does not overflow and the whole-group request remains representable internally. Limit this boundary behavior and test to draft 17+, where the leading-ones encoding can carry u64::MAX.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Agreed, folded into the quest Plan in 2a278aa.
(Written by Claude Opus 5.5)
| `run_publish` (`rs/moq-net/src/ietf/publisher/tracks.rs`). Pausing drops the | ||
| `track::Subscriber`, so its demand leaves the upstream aggregate, and resuming | ||
| subscribes again from the stored parameters at the live edge. Share that loop |
There was a problem hiding this comment.
Keep observing track termination while paused
Dropping the track::Subscriber also removes the TrackServe::poll path that observes a clean track end, while the existing paused run_publish loop only watches listing removal and reports that as NotFound. Consequently, a source that ends while an inbound SUBSCRIBE is paused can leave the request established indefinitely and never send PUBLISH_DONE with TRACK_ENDED; this directly breaks the held paused-SUBSCRIBE removal flow required by quest/m1/archive/subscribe-tracks-outbound.md. Preserve a termination watcher while releasing demand and add an end-while-paused test.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Agreed, folded into the quest Plan in 2a278aa.
(Written by Claude Opus 5.5)
| subscribes again from the stored parameters at the live edge. Share that loop | ||
| between SUBSCRIBE and PUBLISH serves rather than duplicating it. Today the |
There was a problem hiding this comment.
Preserve token renewal across a pause transition
A token-authorized SUBSCRIBE can receive one REQUEST_UPDATE containing both FORWARD=0 and a replacement AUTHORIZATION_TOKEN. Currently apply_subscription_update returns Served::Paused before starting verify_renewal, and the PUBLISH paused loop rejects authorization tokens, so sharing that machinery without an explicit renewal path can acknowledge the update while ignoring its token and later terminate the paused request when the old grant expires. Carry the SUBSCRIBE grant and renewal state across pause/resume and test a combined pause-and-renew update.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Agreed, folded into the quest Plan in 2a278aa.
(Written by Claude Opus 5.5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Summary: imports #6199 and #6263 as m1 quests (FETCH_OK whole group [S], IETF SUBSCRIBE pause [M]); (Written by Claude Opus 5.5) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2a278aae14
ℹ️ 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".
| message has two readings depending on direction. IETF pairings between our own | ||
| released and current builds are out of scope, so no staged rollout. |
There was a problem hiding this comment.
Keep FETCH_OK writes compatible with released peers
When an upgraded publisher serves a whole-group FETCH to a released moq-net subscriber on drafts 14–19, changing the response from {g+1, 0} to {g, 0} makes that subscriber treat the answer as empty and reject it with NotFound. Thus, explicitly excluding released/current pairings plans a user-visible interoperability regression; preserve a compatible write path or negotiate the corrected semantics rather than changing the meaning under existing draft identifiers. The repository requires wire changes to remain backward compatible for published versions.
AGENTS.md reference: AGENTS.md:L84-L86
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Disagree, and this was weighed explicitly when planning. Our implementations always negotiate moq-lite with each other, so an IETF session between a released and a current moq-net is not a pairing we guard (maintainer decision, 2026-10-09). The compatibility that matters on drafts 14 to 19 is with third-party peers. For them, {g, 0} matches how we already write the FETCH request, and the subscriber keeps accepting moxygen's {g+1, 0}. just test interop --all gates that.
(Written by Claude Opus 5.5)
Imports the three open issues without the
questlabel.Quests
quest/m1/ietf-fetch-end-location.md[S] tracks moq-net: draft-14 to 19 FETCH_OK End Location Object 0 means the whole group #6199: on drafts 14 to 19, FETCH_OK End Object 0 means the whole group in both directions, and a FETCH ending at{2^64-1, 0}gets NOT_SUPPORTED.quest/m1/ietf-subscribe-pause.md[M] tracks Publisher ends the subscription on REQUEST_UPDATE with Forward=0 #6263: Forward=0 pauses a SUBSCRIBE (on REQUEST_UPDATE or at SUBSCRIBE) without upstream demand, reusing the PUBLISH pause machinery from feat(ietf): answer SUBSCRIBE_TRACKS through the TRACKS hook #6167.quest/m1/js-fetch.mdnow requires the FETCH_OK fix, so JS never copies the exclusive reading.#6270 is declined as superseded and will be closed with an explanation: keyframe-on-join exists on main as
track::Info::refreshplusDemand::wanted,Infofields are all on the wire, and the refresh epic rejected subscriber-count rules because a count only covers one hop's fanout.Verification of the issues' claims
{g, 0}to{g+1, 0}and echoes it; the subscriber refuses a{g, 0}answer as NotFound; thechecked_add(1)overflow also reaches draft 20+ through the Absolute filter rewrite. Our own FETCH request already writes{g, 0}for a whole group.apply_subscription_updaterather thanUpdate::decode_body. An initial SUBSCRIBE with Forward=0 is also refused.Decisions
#6199 FETCH_OK End Location: goal
{g, 0}as the whole group (still accepts{g+1, 0}), publisher echoes{g, 0}, overflow becomes NOT_SUPPORTED{g+1, 0}#6263 Forward=0: what the publisher does with a paused SUBSCRIBE
#6270 join_next_group and subscriber counts: outcome
subscriber_count()too#6199 milestone
#6263 milestone
Should
js-fetchwait for the #6199 fix?Public API: none. Wire: none in this PR.
(Written by Claude Opus 5.5)
🤖 Generated with Claude Code