Repository navigation
quest: close the silent-peer drain quest (landed in #6201) - #6240
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#6201 already reports an unanswered handshake as no longer active at its local close, so Client::close and a moqsink stop return at once. Correct moq-uring's handshake timeout doc, which named the idle timeout where moq-quic's fixed handshake idle timeout applies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Outcome: the quest's drain fix had already landed in moq-dev/moq#6201, so this PR deletes the quest and fixes one moq-uring doc line. The (Written by Claude Opus 5.5) |
|
Decision settled by the maintainer: option 1. The configured idle timeout ( (Written by Claude Opus 5.5) |
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 35 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f4c06d7650
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Without Config::timeout, moq-quic's fixed handshake idle timeout bounds the QUIC handshake, then Transport::idle_timeout bounds HTTP/3 and MoQ SETUP on top. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merging. Both Codex findings on f4c06d7 are settled:
Decision on record: the configured idle timeout does not bound the QUIC handshake (moq-dev/moq#5163 split them on purpose). (Written by Claude Opus 5.5) |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes out
quest/m1/quic-silent-peer-drain.md(deleted here). Its fix already landed in moq-dev/moq#6201, and this PR records the decision on its open public-API question.Status of the goal
moq-dev/moq#6201 makes moq-quic report a client handshake that never heard its peer (
rem_cid_set == false) as no longer active at its local close.Endpoint::wait_all_draining, and somoq_tokio::Client::close, returns at once. The closing period still runs in the background, so a late server Initial still gets a CONNECTION_CLOSE back. I agree with that over skipping the closing period: the background cost is one table entry for 3 PTO, and a server that answered late frees its state at once instead of waiting out its own handshake timeout.The quest's regression tests already exist on a mocked clock:
tests::unanswered_handshake_drains_at_close(no time advance) andtests::answered_handshake_waits_for_peer_closeclose_during_handshake_does_not_wait_for_silent_peer(paused tokio clock, asserts 0 s)moq-uring never blocked on the drain: its driver publishes a local close once the CONNECTION_CLOSE is staged.
This PR
quest/m1/README.mdentry.moq_uring::quic::handshake::Config::timeout's doc. It said an unset timeout leaves "no bound but the idle timeout", but the QUIC handshake is bounded by moq-quic's fixed 10 s handshake idle timeout, whichTransport::idle_timeoutdoes not change.Transport::idle_timeoutonly takes over once QUIC is established, for HTTP/3 and MoQ SETUP. The doc now names both.Decision
The configured idle timeout does not bound the handshake. The maintainer chose to keep moq-quic's fixed 10 s
handshake_idle_timeoutseparate from--quic-idle-timeoutand moq-uring'sTransport::idle_timeout. moq-dev/moq#5163 split them on purpose. With a short idle timeout, the idle deadline before an RTT sample ismax(idle, 3 * 999 ms), which lands just before the third Initial probe, and impaired-network drills failed on exactly that. msquic and Chromium also keep separate handshake timeouts.Rejected alternatives:
min(idle, 10 s)): brings the fix(moq-quic): fix two handshake stalls under a short idle timeout #5163 flake back for any idle timeout under about 3 s.--quic-handshake-timeoutknob: its only consumer today would be three moq-uring endpoint tests (an_unanswered_dial_times_out,the_backlog_bounds_pending_handshakes,the_backlog_bounds_queued_connections) that wait out the 10 s, and it adds a flag to every binary and a field to every binding's config.Public API and wire
Checks
cargo nextest run -p moq-quic -p moq-tokiofor the three regression tests above: passed.cargo nextest run -p moq-gst stop_: 9 passed, each in 0.3 s or less, against the unreachable test relay (before fix(quic): stop counting an unanswered handshake as active once it closes #6201 a random handful took about 3.08 s).just check:check rs(clippy and rustdoc for moq-uring and its dependents) andcheck questpassed.check flakecould not run here: the image build needsunsharefor a user namespace, which the local sandbox refuses. Nothing here touches the flake.quest check: passed.Follow-ups
split_accept_*tests a 10 ms initial RTT to skip a 3 PTO drain. They wait inwait_idle, which sits out the closing period by design, so fix(quic): stop counting an unanswered handshake as active once it closes #6201 does not change them. No action needed.(Written by Claude Opus 5.5)
🤖 Generated with Claude Code