Repository navigation
quest: plan the m1 probe chain, evicted-group staleness, and review follow-ups #6102
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
30 commits
Select commit
Hold shift + click to select a range
bcfb12c
quest: plan the probe chain move, evicted-group staleness, and #5878/…
kixelated 9731713
quest: move native probing and the failover drift flake, list the new…
kixelated 82b4452
quest: bound what a peer's probe target costs by native's overhead bu…
kixelated 3820f95
quest: refuse spatial input the catalog cannot describe
kixelated 98f9435
quest: widen a mid-group compressed subscription at the subscriber
kixelated 2bc6afe
quest: address review on spatial refusals, rung floors, and test cove…
kixelated a51a0a0
Merge remote-tracking branch 'origin/main' into quest/plan-probe-qmux…
kixelated 9f38bae
quest: gate quic-qmux on the moq-gst close hangs and require it from …
kixelated 0823b19
quest: split viewer targets from the m1 send target
kixelated ab943b0
Merge remote-tracking branch 'origin/main' into quest/plan-probe-qmux…
kixelated c51d285
Merge branch 'quest/plan-probe-qmux-followups' into quest/plan-probe-…
kixelated 50c99f8
quest: address the #6102 merge review on padding versions, probe expi…
kixelated ca7c454
Merge remote-tracking branch 'origin/main' into quest/plan-probe-qmux…
kixelated b2a1dbb
Merge branch 'quest/plan-probe-qmux-followups' into quest/plan-probe-…
kixelated 8d0c53f
Merge remote-tracking branch 'origin/main' into quest/plan-probe-qmux…
kixelated 868a757
Merge branch 'quest/plan-probe-qmux-followups' into quest/plan-probe-…
kixelated c4a8662
Merge remote-tracking branch 'origin/main' into quest/plan-probe-qmux…
kixelated e0076b1
quest: drop links to quests #6141 and #5849 completed
kixelated 3202814
quest: address review on the JS send target, VR pose refusals, and re…
kixelated 6e33aa6
Merge remote-tracking branch 'origin/main' into quest/plan-probe-qmux…
kixelated ba641f7
Merge origin/main into quest/plan-probe-qmux-followups
kixelated d40c37c
Merge origin/main into quest/plan-probe-qmux-followups
kixelated 591201e
Merge origin/main into quest/plan-probe-qmux-followups
kixelated 3667e58
quest: keep subscribe pinned unless its output marks a restart
kixelated 7a92a4e
Merge origin/main into quest/plan-probe-qmux-followups
kixelated 1272c86
quest: address review on restart failure, replica order, receive fair…
kixelated f3cd70d
quest: rung disable needs a sender, so iroh and CUBIC sessions keep e…
kixelated 0e6a252
quest: native probing requires evicted-group staleness; name which na…
kixelated e21672f
quest: VR importers refuse stereo layouts the catalog cannot represent
kixelated a041f48
quest: schedule evicted-group staleness before native probing
kixelated File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| # [S] A mid-group subscription to a compressed track widens to frame 0 | ||
|
|
||
| ## Goal | ||
|
|
||
| An application subscription whose range starts mid-group on a compressed | ||
| track succeeds: the subscriber's requesting model widens the request to frame | ||
| 0 of that group before it leaves, and the reader gets the frames it asked for. | ||
| Today it fails with `Lagged`. The server never widens and keeps serving | ||
| exactly what is asked. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided with the maintainer on 2026-10-20, from | ||
| [#5928](https://github.com/moq-dev/moq/pull/5928)'s Decision 6, which the | ||
| [epic](/quest/m1/compress/README.md)'s Ranges rule records: the subscriber | ||
| widens, never the server. | ||
|
|
||
| - Route-change resume already widens to frame 0. This covers ranges an | ||
| application supplies, through the same requesting-model path rather than a | ||
| second rule. | ||
| - Widen only when the subscriber lacks the group's prefix; one that holds | ||
| frames 0..N-1 still asks from N. | ||
| - The reader still starts at the frame it asked for: the widened prefix only | ||
| feeds the inflater. | ||
|
|
||
| Regression test on mock time, in Rust: a mid-group application subscribe on a | ||
| compressed track returns the requested frames instead of `Lagged`, and the | ||
| wire request starts at frame 0. Mirror it in `js/net` if | ||
| [JavaScript](/quest/m1/compress/js.md) has landed compressed tracks by then. | ||
|
|
||
| Public API: none. Wire: none. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| # [S] An evicted group is judged stale by its successor | ||
|
|
||
| ## Goal | ||
|
|
||
| A group already handed to a reader stays judgeable after the cache evicts | ||
| it: once its successor's arrival plus the reader's budget has passed, the | ||
| group is stale, the same verdict `hooks.staleAt` already gives a resumed | ||
| copy's group by sequence alone. A serve loop that waits on such a group (a | ||
| group stream whose FIN never completes) is then reset as `Old`, whatever the | ||
| budget. | ||
|
|
||
| Today the verdict needs the group to still be cached. Rust `GroupExpiry` | ||
| (`rs/moq-net/src/model/track.rs`) requires the sequence in the cache lookup, | ||
| and JS `#isStale` (`js/net/src/track.ts`) requires the group in the | ||
| timeline. Both caches evict an idle group after their window (Rust | ||
| `cache::DEFAULT_EXPIRY`, JS `CACHE_WINDOW`, both 30 s), so under a budget of | ||
| about 30 s or more a stalled group is never convicted. Since | ||
| [#6059](https://github.com/moq-dev/moq/pull/6059) the same stalled stream | ||
| also holds the IETF PUBLISH_DONE, which waits on a finished group's FIN | ||
| under the budget. | ||
|
|
||
| ## Plan | ||
|
|
||
| Found in #6059's follow-ups and decided with the maintainer on 2026-10-20 as | ||
| a sibling of [Drop set](/quest/m1/drop-set.md): that quest judges missing | ||
| groups, this one judges groups a reader already holds. | ||
|
|
||
| - Judge by the successor, as `#staleAt` does for a sequence the track does | ||
| not hold. The verdict needs the successor's arrival (and its reach, for the | ||
| media-time arm), not the evicted group itself. | ||
| - Find out what the cache-membership checks guard before dropping them, such | ||
| as a different copy now occupying the sequence, and keep that guard. | ||
| - Settle what the verdict reads once the successor is evicted too. It must | ||
| never convict early: any later group arrived no earlier than the successor, | ||
| and the newest group is never stale. | ||
| - Check `FetchExpiry` beside `GroupExpiry`, which has the same cache-lookup | ||
| condition. | ||
|
|
||
| Regression tests on mock time, Rust and JS, each failing without the fix, | ||
| with a budget of at least the cache window: a handed-out group whose stream | ||
| never completes is evicted, then reset as `Old` once its successor's arrival | ||
| plus the budget passes, and on IETF the PUBLISH_DONE then goes out. The | ||
| newest group is still never convicted. | ||
|
|
||
| Public API: none. Wire: none. | ||
|
|
||
| ## Related | ||
|
|
||
| - [Drop set](/quest/m1/drop-set.md) - each cursor judges missing groups against its own budget | ||
| - [#6059](https://github.com/moq-dev/moq/pull/6059) - bounds a stalled group stream's FIN wait by the age budget, which this extends past eviction |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| # [XS] Every IETF setup wait runs under request validity | ||
|
|
||
| ## Goal | ||
|
|
||
| Every wait while the IETF subscriber sets up a request ends as soon as the | ||
| request stops being valid (its route retired, or its grant revoked, narrowed, | ||
| or expired), with the same local refusal and peer cancellation that the | ||
| SUBSCRIBE's request-ID and SUBSCRIBE_OK waits give since | ||
| [#6061](https://github.com/moq-dev/moq/pull/6061). In | ||
| `rs/moq-net/src/ietf/subscriber.rs` that covers: | ||
|
|
||
| - `Stream::open` for SUBSCRIBE, TRACK_STATUS, the cache-miss group FETCH, | ||
| and the joining FETCH on draft 17+; | ||
| - the request-ID wait for a fetch-only TRACK_STATUS; | ||
| - the cache-miss group FETCH's request-ID and response waits, whose response | ||
| wait still uses a `retired` flag. | ||
|
|
||
| Today each is bounded only by QUIC stream credit or the ten-second | ||
| request-ID give-up. | ||
|
|
||
| ## Plan | ||
|
|
||
| Decided with the maintainer on 2026-10-20, from #6061's follow-ups: | ||
|
|
||
| - Reuse #6061's poll-native shape: poll the gate and `validity` beside | ||
| `Control::poll_credit(waiter, &mut Deadline)` or the response read inside | ||
| one wait, rather than racing the whole setup future. An allocated ID is | ||
| still sent on drafts 14-16, since the peer grants MAX_REQUEST_ID credit | ||
| back only for requests it receives; the response wait then cancels it. | ||
| - Refuse the request locally before awaiting the peer's acknowledgement of | ||
| the cancellation, as #6061 does. | ||
| - If [Rust request credit](/quest/m1/rs-request-credit.md) lands first, | ||
| `Stream::open` no longer waits for stream credit, and only the request-ID | ||
| and response waits remain here. | ||
|
|
||
| Regression tests on sim time, one per wait, each failing on main by timing | ||
| out: a revoked, narrowed, and expired grant and a route retirement during | ||
| the wait each refuse the request promptly, on drafts 14 and 16 and on 17+ | ||
| where the wait differs. | ||
|
|
||
| Public API: none. Wire: none. | ||
|
|
||
| ## Related | ||
|
|
||
| - [#6061](https://github.com/moq-dev/moq/pull/6061) - brings the SUBSCRIBE's own request-ID and SUBSCRIBE_OK waits under the grant | ||
| - [Rust request credit](/quest/m1/rs-request-credit.md) - a request without stream credit fails at once instead of waiting in `Stream::open` |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fresh evidence after the
Required-link fix is the milestone schedule: native probing remains here at line 90, while its new evicted-group-staleness prerequisite is not scheduled until line 105, contrary to this README's prerequisite-first ordering. Executing m1 in this order therefore still ships probing while an evicted group cannot be expired, allowing ProbeBW_UP to retransmit its stale in-flight bytes; move the staleness quest ahead of this entry.AGENTS.md reference: AGENTS.md:L24-L24
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed, fixed in a041f48: the staleness quest now sits right before native probing in m1.
(Written by Claude Opus 5.5)