@jesup wanted to land #3467 and work on the Claude review comments as a follow-on.
Summary
This PR adds WebTransport sendGroup support across the HTTP/3 and transport layers: per-connection SendGroupId minting, session-scoped group registration/validation, and a per-group round-robin scheduler in SendStreams::write_frames that treats groups as bandwidth-equals with per-group sendOrder namespacing — matching the WebTransport spec.
Architecture: The design cleanly separates concerns — HTTP/3 owns group-to-session binding, transport owns scheduling. The PerGroupQueues abstraction and the single-group fast path are well-motivated. The new benchmarks (make_grouped_streams, make_sendordered_streams) and thorough unit tests (flow-control-blocked starvation, drained-peer cursor, fairness toggle round-trip) give good confidence in the scheduler correctness.
Main finding: The index-based round-robin cursors (per_group_next, fair_rr_next) can skip entries after shift_remove / retain / extract_if shift indices — see inline comments for details and a suggested fix. This is a minor fairness issue (bounded by one frame per removal event), not a correctness bug.
Originally posted by @github-actions[bot] in #3467 (review)
@jesup wanted to land #3467 and work on the Claude review comments as a follow-on.
Summary
This PR adds WebTransport
sendGroupsupport across the HTTP/3 and transport layers: per-connectionSendGroupIdminting, session-scoped group registration/validation, and a per-group round-robin scheduler inSendStreams::write_framesthat treats groups as bandwidth-equals with per-groupsendOrdernamespacing — matching the WebTransport spec.Architecture: The design cleanly separates concerns — HTTP/3 owns group-to-session binding, transport owns scheduling. The
PerGroupQueuesabstraction and the single-group fast path are well-motivated. The new benchmarks (make_grouped_streams,make_sendordered_streams) and thorough unit tests (flow-control-blocked starvation, drained-peer cursor, fairness toggle round-trip) give good confidence in the scheduler correctness.Main finding: The index-based round-robin cursors (
per_group_next,fair_rr_next) can skip entries aftershift_remove/retain/extract_ifshift indices — see inline comments for details and a suggested fix. This is a minor fairness issue (bounded by one frame per removal event), not a correctness bug.Originally posted by @github-actions[bot] in #3467 (review)