From 4e91b5045c4b5f3dbc5e51ef1ffd24c2175174b6 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sun, 8 Nov 2026 23:11:06 -0800 Subject: [PATCH 1/2] test(js/net): quarantine the datagram session-close-after-end test and plan its fix Its lite-05 case failed the merge queue for #8276 after #8321 re-enabled it. Co-Authored-By: Claude Opus 5.5 --- js/net/src/lite/datagram-tracks.test.ts | 4 ++- quest/m0/test-flakes-2/README.md | 7 +++++ quest/m0/test-flakes-2/datagram-close-end.md | 28 ++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 quest/m0/test-flakes-2/datagram-close-end.md diff --git a/js/net/src/lite/datagram-tracks.test.ts b/js/net/src/lite/datagram-tracks.test.ts index d44dffe13db..1eccc24966e 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) even after #8321's budget mock. /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..ba9f06b14c3 --- /dev/null +++ b/quest/m0/test-flakes-2/datagram-close-end.md @@ -0,0 +1,28 @@ +# [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) +mocked `Budget.poll` so the publisher's end can't stall behind a write-budget +host task, and re-enabled it. 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. From 3ce0a4df585700e318a55dd631e5ed8802117b8e Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sun, 8 Nov 2026 23:23:53 -0800 Subject: [PATCH 2/2] quest: #8321 re-enabled the test without a fix Applies pullfrog's suggestion and corrects the same claim in the test comment. Co-Authored-By: Claude Opus 5.5 --- js/net/src/lite/datagram-tracks.test.ts | 2 +- quest/m0/test-flakes-2/datagram-close-end.md | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/js/net/src/lite/datagram-tracks.test.ts b/js/net/src/lite/datagram-tracks.test.ts index 1eccc24966e..ded3c095732 100644 --- a/js/net/src/lite/datagram-tracks.test.ts +++ b/js/net/src/lite/datagram-tracks.test.ts @@ -470,7 +470,7 @@ for (const alpn of [ALPN_05, ALPN_06, ALPN_07_WIP]) { // 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]) { // Quarantined: fails in the merge queue with "Session: remote error: 0" (lite-06 on #8280, lite-05 on - // #8276) even after #8321's budget mock. /quest/m0/test-flakes-2/datagram-close-end.md + // #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 }); diff --git a/quest/m0/test-flakes-2/datagram-close-end.md b/quest/m0/test-flakes-2/datagram-close-end.md index ba9f06b14c3..f5ff0071f8c 100644 --- a/quest/m0/test-flakes-2/datagram-close-end.md +++ b/quest/m0/test-flakes-2/datagram-close-end.md @@ -12,8 +12,10 @@ 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) -mocked `Budget.poll` so the publisher's end can't stall behind a write-budget -host task, and re-enabled it. The lite-05 case then failed the merge queue for +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