Repository navigation
Conversation
A relay's route node handed a claim of another node to every lite-07 announce stream as soon as it arrived, but the claim reached the relay's origin only once the session serving it drained the node's Serve output. A peer could name the new instance in a request during that window and be refused as unroutable. The node now holds each start or restart back from the other streams until a stream serving it confirms that instance, and the floors certify nothing meanwhile. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Problem
A relay's route node handed a claim of another node to every lite-07 announce stream as soon as the claim arrived, but the claim entered the relay's origin route table only once the session serving it drained the node's
Serveoutput and calledorigin.forward. Under load that drain takes milliseconds. A downstream peer that read the advertisement in that window and sent a request pinning the new instance and node was refused at once withsubscribe: unroutable, typically when a broadcast restarts at a new instance and a player resubscribes.Approach
The node advertises a claim to other streams only once a stream serving it confirmed that instance (
Stream::serving, now carrying the served claim;Slot::confirmedrecords the instance and epoch).Outbox::withheld) while the claim has a serving stream and none confirmed its instance. The peer keeps what it was last sent, a newer change replaces a held one, and a route end drops them.State::flushnow serves the shown claims before queuing the batches that carry them, so a batch sees whether its claim is served yet.a_claim_goes_on_only_once_served(node layer) fails without the gate and covers the start, the restart, and a stale confirmation.Impact
route::nodeis crate-private).Alternatives
Follow-ups
None.
Caused by
Models
Size: M
Implementer: Claude Code, claude-opus-5-5, medium effort (iterate, M)
🤖 Generated with Claude Code
(Written by Claude Opus 5.5 with medium)
Review
Rewritten by
quest reviewafter each round.01a1cc90-0fb4-7a90-bda2-92b371b732b2, round 1Exact-path announcements are gated, but narrowed covering announcements still expose the routing race and need rework.rs/moq-net/src/route/node.rs:778:Gate narrowed covering claims on their source confirmation