diff --git a/js/net/src/lite/datagram-tracks.test.ts b/js/net/src/lite/datagram-tracks.test.ts index d44dffe13db..ded3c095732 100644 --- a/js/net/src/lite/datagram-tracks.test.ts +++ b/js/net/src/lite/datagram-tracks.test.ts @@ -469,7 +469,9 @@ for (const alpn of [ALPN_05, ALPN_06, ALPN_07_WIP]) { // A track's end waits a host task for the datagrams received with it. A session close in // between finishes the track rather than cutting it off: the publisher already ended it. for (const alpn of [ALPN_05, ALPN_06, ALPN_07_WIP]) { - test(`${alpn}: a session close right after a datagram track's end keeps the end`, async () => { + // Quarantined: fails in the merge queue with "Session: remote error: 0" (lite-06 on #8280, lite-05 on + // #8276 after #8321 re-enabled it). /quest/m0/test-flakes-2/datagram-close-end.md + test.skip(`${alpn}: a session close right after a datagram track's end keeps the end`, async () => { const source = new Origin(); const publication = source.route(path, { hidden: true }); const datagrams = publication.broadcast.createDatagrams("audio"); diff --git a/quest/m0/test-flakes-2/README.md b/quest/m0/test-flakes-2/README.md index 61b115b76e4..ec7450f49fc 100644 --- a/quest/m0/test-flakes-2/README.md +++ b/quest/m0/test-flakes-2/README.md @@ -229,6 +229,12 @@ two random-mesh withdrawal tests, which hit nextest's 60 s kill in `just check` and are quarantined with `#[ignore]` by [moq-dev/moq#8336](https://github.com/moq-dev/moq/pull/8336). +Added 2026-11-09 (maintainer's standing rule that flakes join this epic): +`js/net`'s datagram session-close-after-end test again, whose lite-05 case +failed the merge queue for [moq-dev/moq#8276](https://github.com/moq-dev/moq/pull/8276) +after [moq-dev/moq#8321](https://github.com/moq-dev/moq/pull/8321) re-enabled it. +It is quarantined with `test.skip` for every version until its child fixes it. + Public API: none. Wire: none. ## Required @@ -240,3 +246,4 @@ Public API: none. Wire: none. - [js/net's compressed-frame cap test holds up under load](/quest/m0/test-flakes-2/compressed-frame-cap.md) - the cap is proven without a 32 MiB payload, and its `test.skip` is removed - [js/net's lite-07 re-dropped re-offer test holds up under load](/quest/m0/test-flakes-2/redropped-reoffer.md) - update 3 is ordered before the re-offer opens by an event, not a yield count, and its `test.skip` is removed - [moq-net's random-mesh withdrawal tests fit the gate](/quest/m0/test-flakes-2/mesh-withdraw-runtime.md) - the 200-seed mesh tests cost seconds of CPU, and their `#[ignore]` is removed +- [js/net's datagram session-close-after-end test holds up under load](/quest/m0/test-flakes-2/datagram-close-end.md) - the abort is ordered after the end by an event the client observes, and its `test.skip` is removed diff --git a/quest/m0/test-flakes-2/datagram-close-end.md b/quest/m0/test-flakes-2/datagram-close-end.md new file mode 100644 index 00000000000..f5ff0071f8c --- /dev/null +++ b/quest/m0/test-flakes-2/datagram-close-end.md @@ -0,0 +1,30 @@ +# [S] js/net's datagram session-close-after-end test holds up under load + +## Goal + +`js/net/src/lite/datagram-tracks.test.ts`'s "a session close right after a +datagram track's end keeps the end" passes in the merge queue for every +version it covers, and its `test.skip` is removed. + +## Plan + +Planned 2026-11-09 (maintainer's standing rule that flakes join this epic). +The lite-06 case dropped +[moq-dev/moq#8280](https://github.com/moq-dev/moq/pull/8280) from the merge +queue and was quarantined; [moq-dev/moq#8321](https://github.com/moq-dev/moq/pull/8321) +re-enabled it with no fix after finding no repro; its investigation, which rules +out microtask reordering and names `Budget` before `connect` and `now()` in +`group.ts`/`cache.ts` as the real-time suspects, stays in its PR body. The +lite-05 case then failed the merge queue for +[moq-dev/moq#8276](https://github.com/moq-dev/moq/pull/8276) with `Session: +remote error: 0`: the reader saw the abort before the end. The land fixer's +note on #8276 records 20 clean repeats of the file on a scratch merge, so it +fails only under the queue's load. + +The test assumes 10000 microtask turns deliver the publisher's end before +`client.abort()`. Find the step that still crosses a host task under load, and +order the abort after the end by an event the client observes (such as the +reader's track reaching its end state), never by more turns or a sleep. Then +remove the `test.skip` and delete this quest. + +Public API: none. Wire: none.