Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions quest/m0/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ edge, which embeds moq-relay; it moved there on 2026-09-28.
- [Release shutdown backport](/quest/m0/ffi-shutdown-backport.md) - `release` publishes a non-breaking moq-ffi with an async `drain()` and qmux sessions on the QUIC stream limit
- [Backport audio groupDuration](/quest/m0/backport-audio-group-duration.md) - `@moq/publish` 0.5.4 on `release` can pack several Opus frames per group, making Cloudflare's relay drop audio less often
- [Backport the SETUP-path and iroh-key fixes](/quest/m0/backport-security-fixes.md) - `release` refuses a conflicting SETUP Path and keeps persisted iroh keys private, in one patch release
- [Backport the joined-head FETCH race fix](/quest/m0/backport-fill-head-race.md) - a `release` relay stops FETCHing a group head its own SUBSCRIBE is bringing, which left live readers hanging
- [CI cost and latency](/quest/m0/ci/README.md) - cloud CI runs only in a batched merge gate as one `just ci` pass per batch, expensive checks run nightly and gate `release`, caches move to R2, and runners are chosen last
- [More tests under load](/quest/m0/test-flakes-2/README.md) - load-only and queue failures, one quest per flake, fixed at the cause, since each one fails a whole batch
- [Backport the dot-segment and auth-redirect refusals](/quest/m0/backport-release-hardening.md) - `release`'s relay refuses dot-segment paths and its auth client refuses redirects
40 changes: 40 additions & 0 deletions quest/m0/backport-fill-head-race.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# [M] Backport the joined-head FETCH race fix to release

## Goal

A relay on `release` no longer FETCHes the head of a group that its own
SUBSCRIBE is already bringing. In that race the fetched objects can land first,
so the relay caches the group as fetched, refuses the live tail stream that ends
it as `duplicate`, and leaves live readers waiting on the group until they time
out. This ports fix 2 of
[moq-dev/moq#7135](https://github.com/moq-dev/moq/pull/7135) and ships it in a
`moq-net` patch release.

## Plan

Decided 2026-10-30 (maintainer): port only the relay fix. Why: #7135's other
fix, the JS publisher answering an `INCLUDE_PROPERTIES=0` FETCH without
timestamps, cannot happen on `release`, whose `js/net/src/ietf/publisher.ts`
`runFetch` refuses every FETCH.

Decided 2026-10-30 (maintainer): m0, beside the other `release` backports.
Why: it is an intermittent relay hang on the shipped line.

`release` has the same machinery as main before #7135: the joining-head
`Fill` in `rs/moq-net/src/ietf/subscriber.rs` and the group FETCH that fills a
cache miss (`run_group_fetch`). It has no `rs/moq-net/src/model/track/fill.rs`,
so the fix is hand-ported, not cherry-picked. Port the behavior: a cache miss
for the joined group waits until the subscription's own head arrives or its
request settles, then the cache answers it; a failed head request still falls
back to a FETCH. Only that group waits, so older history still FETCHes at once,
and the wait ends when no reader wants the group or the track aborts. Port
#7135's subscriber tests that cover this alongside it.

Start by reproducing the race on `release` with one of those tests. If
`release` cannot hit it, delete this quest and say why in the PR.

Public API: none. Wire: none.

## Required

- [The browser backend baseline completes on IETF22](/quest/m0/nightly/browser-baseline.md) - lands the fix this quest ports, on main
Loading