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
2 changes: 1 addition & 1 deletion quest/m0/remove-gossip.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,4 @@ announcing `.internal/origins`.

## Related

- [Cluster routing](/quest/m1/cluster-routing/README.md) - takes its topology from configured links only
- [Cluster topology](/quest/m1/cluster-routing/topology.md) - takes its topology from configured links only, so it waits on this
2 changes: 1 addition & 1 deletion quest/m0/wildcard/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ is the catch-all `**`, a claim about every path at once.
The cost of enumerating is real even though its last measurement is stale.
One announcement measured 8.8 KB per relay plus 4.3 KB per additional route
before prefix routes made a standby route a table entry;
[Cluster routing](/quest/m1/cluster-routing/README.md) owns remeasuring it. Whatever the current
[Cluster routing's memory benchmark](/quest/m1/cluster-routing/memory.md) remeasures it. Whatever the current
number, every relay that hears an announcement pays it whether or not anything
there subscribes, so "workers times broadcasts" is that number multiplied
across the fleet in resident memory.
Expand Down
5 changes: 3 additions & 2 deletions quest/m1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ QUIC studies there on that rule.

## Required

- [Cluster routing](/quest/m1/cluster-routing/README.md) - an announcement says where a broadcast originates, not how to reach it, and a relay hears only the prefixes its clients asked for
- [Cluster idle timeout](/quest/m1/cluster-idle-timeout.md) - a relay notices a silent peer relay within seconds, not after the shared 30 s QUIC idle timeout
- [Cluster routing](/quest/m1/cluster-routing/README.md) - a relay learns the relay graph once and each announcement once, not once per neighbour, and redundant publishers share an epoch instead of `--hop`
- [Track tail interop](/quest/m1/track-tail-interop.md) - a Rust publisher ending a track with a group in flight is read to its end by the JS subscriber, and the reverse, in `just test interop`
- [Merge queue](/quest/m1/merge-queue.md) - the required checks run on `merge_group`, so a stale green check can no longer break main
- [Binding audio delay](/quest/m1/binding-surface.md) - moq-ffi and every wrapper configure and observe audio playout delay
Expand All @@ -49,7 +50,7 @@ QUIC studies there on that rule.
- [TS PSI reassembly](/quest/m1/ts-psi-reassembly.md) - `import ts` reads a PAT or PMT that spans packets or follows a nonzero pointer_field instead of aborting, and one corrupted section costs a repetition and a counted `CRC_error`, not the import
- [RTMP interleaving](/quest/m1/rtmp-interleaving.md) - isolate partial messages before optimizing assembly copies
- [TS stats module](/quest/m1/ts-stats-module.md) - on dev, the TS stats types move under `ts::stats` as `Snapshot` and `Stream`, with an owned `track`
- [Same-hop importers](/quest/m1/hop-aligned-import.md) - importers sharing a `--hop` and fed one stream publish identical groups and timestamps, so failover survives
- [Same-hop importers](/quest/m1/hop-aligned-import.md) - importers fed one stream publish identical groups and timestamps, so failover between a redundant pair survives
- [Audio capture without ALSA link](/quest/m1/capture-alsa-link.md) - moq-audio capture and playback build on Linux without linking libasound
- [Capture by default](/quest/m1/capture-default.md) - moq-video and moq-audio build `capture` by default, so pre-merge checks test it and the capture gate goes away
- [Ship capture and playback](/quest/m1/cli-packaging.md) - a released moq binary can capture and play, which no distribution currently enables
Expand Down
7 changes: 4 additions & 3 deletions quest/m1/broadcast-epoch/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ The epoch rides in the path, so it survives any moq-transport relay, and no
wire message changes. At an epoch-aware relay, a request for a bare name
resolves to its newest live epoch on every protocol version.

Non-goals: redundant publishers sharing one epoch, and failing over between
them faster than the keep-alive (a question
[Cluster routing](/quest/m1/cluster-routing/README.md) owns). Also out of scope: trusting the publisher's clock (a far-future epoch
Non-goals: pooling redundant publishers that share one epoch, which
[Cluster routing](/quest/m1/cluster-routing/README.md)'s selection and
`--hop` removal own; this line only keeps an epoch a caller supplies. Also out
of scope: trusting the publisher's clock (a far-future epoch
wins until its route goes away).

## Plan
Expand Down
29 changes: 29 additions & 0 deletions quest/m1/cluster-idle-timeout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# [S] Cluster idle timeout

## Goal

A relay notices a silent peer relay within seconds, not after the 30 s QUIC
idle timeout it shares with every viewer. moq.pro's routing simulator found
that failure detection, not routing, sets every outage window: a silent link
or relay loss goes unnoticed for the idle timeout in every routing design,
and subscribes through it go nowhere meanwhile.

## Plan

- Cluster sessions get their own idle timeout and keep-alive, shorter than
the `--quic-*` defaults (`rs/moq-tokio/src/quic.rs`, 30 s idle and 5 s
keep-alive). A keep-alive alone only keeps a quiet session open; the
timeout is what detects loss.
Comment on lines +13 to +16

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Apply cluster liveness settings to WebSocket fallback

When a configured https:// cluster peer falls back to WebSocket, this QUIC-only plan does not shorten failure detection: rs/moq-tokio/src/websocket.rs:351-355 constructs the fallback with the fixed KeepAlive::default() 5 s/30 s policy. Such links therefore retain the outage window this quest is intended to remove. Include the WebSocket transport in the configurable cluster-session timeout, or explicitly refuse it for cluster links when the shorter policy cannot be applied. (Written by GPT-5.6 Sol)

AGENTS.md reference: AGENTS.md:L17-L17

Useful? React with 👍 / 👎.

- QUIC's effective idle timeout is the smaller of the two endpoints'
(RFC 9000 section 10.1), so the dialing relay's setting bounds both sides of
a cluster link. Say so where the setting is documented.
- Pick the default in the PR with its reasoning: loss detection against
spurious drops on a lossy intercontinental link.
- Docs: `doc/bin/relay/cluster.md` and `doc/bin/relay/config.md`.

Public API: adds a relay config field; lands on `main`.

## Related

- [Cluster routing](/quest/m1/cluster-routing/README.md) - its liveness and failover depend on this detection
- [Broadcast epochs](/quest/m1/broadcast-epoch/README.md) - viewers wait out the same timeout for an old route
Loading