Skip to content

WebTransport: rewire the new datagram queue onto Connection's engine - #3985

Closed
jesup wants to merge 1 commit into
users/jesup/expose_expire_datagramsfrom
users/jesup/hook_up_queue
Closed

jesup wants to merge 1 commit into
users/jesup/expose_expire_datagramsfrom
users/jesup/hook_up_queue

Conversation

@jesup

@jesup jesup commented Sep 14, 2026

Copy link
Copy Markdown
Member

No description provided.

@codspeed

codspeed Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Merging this PR will degrade performance by 3.1%

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 1 improved benchmark
❌ 12 regressed benchmarks
✅ 86 untouched benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
❌ WallTime walltime/1000-streams/each-1000-bytes 11.1 ms 12.5 ms -11.2%
❌ Simulation simulated/1000-streams/each-1000-bytes 171.7 ms 181.1 ms -5.14%
❌ WallTime walltime/10-streams/each-1048576-bytes 27.6 ms 28.8 ms -4.16%
❌ WallTime walltime/1-streams/each-4194304-bytes 10.3 ms 10.7 ms -3.25%
❌ WallTime 1-conn/1-100mb-req (aka. Upload) 47.3 ms 48.9 ms -3.23%
❌ WallTime walltime/1000-streams/each-1-bytes 3.6 ms 3.7 ms -2.77%
❌ WallTime 1-conn/1-100mb-resp (aka. Download) 47.5 ms 48.7 ms -2.56%
❌ WallTime walltime/1-streams/each-1000-bytes 127.6 µs 130.6 µs -2.28%
❌ WallTime walltime/pacing-true/varying-seeds 2 ms 2 ms -2.13%
❌ Simulation simulated/pacing-false/varying-seeds 72.7 ms 74.3 ms -2.11%
❌ Simulation coalesce_acked_from_zero 1 ranges 2.6 µs 2.7 µs -2.02%
❌ Simulation simulated/pacing-false/same-seed 75.7 ms 77.2 ms -2.02%
⚡ WallTime 1-conn/10_000-parallel-1b-resp (aka. RPS) 68.5 ms 66.4 ms +3.18%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing users/jesup/hook_up_queue (a372889) with users/jesup/expose_expire_datagrams (0357aa9)1

Open in CodSpeed

Footnotes

  1. No successful run was found on users/jesup/expose_expire_datagrams (7f57f2c) during the generation of this report, so 01554b3 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report. ↩

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Queue backpressure, size validation, outcome reporting, and expiry accounting are currently incorrect or incomplete.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Rewires WebTransport datagrams to the transport connection’s per-session queue.

Changes:

  • Adds send-group/order parameters and richer queue outcomes.
  • Adds queue lifecycle, expiry, capacity, and statistics plumbing.
  • Updates WebTransport tests and connect-udp compatibility handling.
File summaries
File Description
neqo-http3/tests/webtransport.rs Updates datagram calls.
neqo-http3/src/webtransport.rs Exposes new queue API and test helpers.
neqo-http3/src/features/extended_connect/tests/webtransport/mod.rs Updates test helper return types.
neqo-http3/src/features/extended_connect/tests/webtransport/datagrams.rs Updates backpressure assertions.
neqo-http3/src/features/extended_connect/session.rs Integrates per-session datagram queues.
neqo-http3/src/connection.rs Adds queue configuration and expiry plumbing.
neqo-http3/src/connect_udp.rs Adapts connect-udp to the new queue.
Review details

Suppressed comments (3)

neqo-http3/src/features/extended_connect/session.rs:482

  • This bypasses the peer's advertised QUIC DATAGRAM size limit. The previous Connection::send_datagram call returned TooMuchData when the fully encoded payload exceeded remote_datagram_size; enqueue_datagram performs no such check, and packet construction only checks available MTU space. Consequently an oversized frame can be transmitted and both public APIs violate their documented TooMuchData contract. Validate the prefixed payload before enqueueing.
        let id = match id.into() {
            DatagramTracking::None => None,
            DatagramTracking::Id(v) => Some(v),
        };
        let outcome = conn.enqueue_datagram(

neqo-http3/src/features/extended_connect/session.rs:532

  • Connection::expire_datagrams sweeps every per-session queue, not this session's queue. Multiple WebTransport sessions on one connection are supported (and exercised by datagrams_multiple_session), so the first hash-map entry processed receives the expiry count for all sessions while the others receive zero. The transport expiry API needs to preserve the owning session ID (or offer a scoped sweep) before updating per-session stats.
    pub(crate) fn expire_datagrams(
        &mut self,
        conn: &mut Connection,
        now: Instant,
    ) -> Vec<Option<DatagramId>> {
        let expired = conn.expire_datagrams(now);
        self.protocol
            .record_expired_outgoing_datagrams(u64::try_from(expired.len()).unwrap_or(u64::MAX));

neqo-http3/src/features/extended_connect/session.rs:742

  • No Protocol implementation overrides this new method, including the WebTransport protocol that owns SessionStats. Calls to record_expired_outgoing_datagrams therefore remain a no-op and datagrams_expired_outgoing can never increase. Implement the override on webtransport_session::Session and update its counter.
    /// Record that `count` outgoing datagrams expired before being sent.
    /// A no-op default for protocols that don't track [`SessionStats`].
    fn record_expired_outgoing_datagrams(&mut self, _count: u64) {}
  • Files reviewed: 7/7 changed files
  • Comments generated: 4
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread neqo-http3/src/connect_udp.rs Outdated
Comment thread neqo-http3/src/connection.rs Outdated
Comment thread neqo-http3/src/features/extended_connect/session.rs
@jesup
jesup force-pushed the users/jesup/expose_expire_datagrams branch from b9b2b07 to b8a0b6f Compare September 14, 2026 05:31
@jesup
jesup requested a review from omansfeld as a code owner September 14, 2026 05:31
@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 1f3c5c1 to 40b0996 Compare September 14, 2026 05:31
@codecov

codecov Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.18310% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 97.10%. Comparing base (7f57f2c) to head (a372889).

Additional details and impacted files
@@                           Coverage Diff                           @@
##           users/jesup/expose_expire_datagrams    #3985      +/-   ##
=======================================================================
+ Coverage                                97.08%   97.10%   +0.02%     
=======================================================================
  Files                                      114      114              
  Lines                                    40949    41061     +112     
  Branches                                 40949    41061     +112     
=======================================================================
+ Hits                                     39754    39873     +119     
+ Misses                                    1181     1174       -7     
  Partials                                    14       14              
Flag Coverage Δ
linux 97.16% <97.18%> (+0.01%) ⬆️
macos 95.28% <95.07%> (+0.01%) ⬆️
windows 95.39% <95.07%> (+0.03%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
neqo-common 99.31% <ø> (ø)
neqo-http3 95.35% <97.18%> (+0.02%) ⬆️
neqo-qpack 96.97% <ø> (ø)
neqo-transport 97.94% <ø> (+0.04%) ⬆️
neqo-udp 95.37% <ø> (ø)
mtu 89.13% <ø> (ø)
🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@jesup
jesup force-pushed the users/jesup/expose_expire_datagrams branch from b8a0b6f to d9b1eba Compare September 14, 2026 17:56
@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 40b0996 to 95b5b8d Compare September 14, 2026 17:56
Comment thread neqo-http3/src/connect_udp.rs
@jesup
jesup force-pushed the users/jesup/expose_expire_datagrams branch from d9b1eba to a33970b Compare September 16, 2026 03:45
@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 95b5b8d to 6a29098 Compare September 16, 2026 03:45
@jesup
jesup force-pushed the users/jesup/expose_expire_datagrams branch from a33970b to 76a8abc Compare September 16, 2026 17:19
@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 6a29098 to 71651fe Compare September 16, 2026 17:19
@jesup
jesup force-pushed the users/jesup/expose_expire_datagrams branch from 76a8abc to af9c4c2 Compare September 17, 2026 05:01
@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 71651fe to c1ce174 Compare September 17, 2026 05:01
Comment thread neqo-http3/src/features/extended_connect/session.rs Outdated
Comment thread neqo-http3/src/features/extended_connect/session.rs
Comment thread neqo-http3/tests/connect_udp.rs Outdated
@jesup
jesup force-pushed the users/jesup/expose_expire_datagrams branch from af9c4c2 to d17f44b Compare September 20, 2026 19:34
@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from c1ce174 to 69362db Compare September 20, 2026 19:34
jesup added a commit that referenced this pull request Sep 20, 2026
Reword send_datagram's doc: send-group registration is per-session
(register_send_group acts on the session, not individual streams), so
"registered for this session's streams" overstated what's actually
checked. The lazy-registration suggestion on the same PR is left as-is
per mxinden's own "not critical" note.
@jesup
jesup force-pushed the users/jesup/expose_expire_datagrams branch from d17f44b to 9d772af Compare September 23, 2026 06:27
@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 69362db to 65af4bd Compare September 23, 2026 06:27
@github-actions

Copy link
Copy Markdown
Contributor

Performance profiles for profiler.firefox.com

Benchmarks (14)
  • neqo-bin-main: pr · base
  • neqo-common-decoder: pr · base
  • neqo-http3-streams_simulated: pr · base
  • neqo-http3-streams_walltime: pr · base
  • neqo-transport-frame_decode: pr · base
  • neqo-transport-min_bandwidth: pr · base
  • neqo-transport-pacer: pr · base
  • neqo-transport-packet_codec: pr · base
  • neqo-transport-range_tracker: pr · base
  • neqo-transport-rx_stream_orderer: pr · base
  • neqo-transport-send_streams: pr · base
  • neqo-transport-sent_packets: pr · base
  • neqo-transport-transfer_simulated: pr · base
  • neqo-transport-transfer_walltime: pr · base
Comparisons (5)

@mxinden mxinden left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Two comments. Otherwise ready to merge.

Comment thread neqo-http3/src/connection.rs Outdated
Send datagrams through the new per-session queue instead of the legacy
connection-wide FIFO, for both WebTransport and connect-udp, so
send_datagram reports the queue's backpressure outcome and send_group_id/
send_order reach the scheduler.  Each process_http3 tick expires every
active session's queue, and a locally closed session drops its queue.

connect_udp_send_datagram and connect_udp::ServerSession::send_datagram
now return DatagramQueueOutcome, like webtransport_send_datagram, instead
of collapsing AboveWatermark, Overflowed and Rejected into Ok(false), so
a caller can tell a datagram that was queued but should trigger backoff
from one that was refused.  This changes the connect-udp public
signature.

connect-udp has no outgoingMaxBufferedDatagrams of its own, so connect-udp
sessions, created or accepted, get a fixed high water mark of 10, the
depth the legacy queue enforced, and its resume-signal test drives that
instead.

Tests cover send-order priority and byte-budget eviction through a live
WebTransport connection, and that the queue's resume signal still reaches
Http3ServerEvent::OutgoingDatagramSpaceAvailable.
@jesup
jesup force-pushed the users/jesup/expose_expire_datagrams branch from 0357aa9 to 7f57f2c Compare September 25, 2026 15:05
@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 6c1685e to a372889 Compare September 25, 2026 15:05
@github-actions

Copy link
Copy Markdown
Contributor

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to users/jesup/expose_expire_datagrams at 7f57f2c.

neqo-pr as clientneqo-pr as server
neqo-pr vs. go-x-net: BP BA
neqo-pr vs. haproxy: BP BA
neqo-pr vs. linuxquic: baseline result missing
neqo-pr vs. lsquic: L1 C1
neqo-pr vs. msquic: Z A L1 🚀L2 C1
neqo-pr vs. mvfst: A 🚀BA
neqo-pr vs. neqo: Z A
neqo-pr vs. nginx: BP BA
neqo-pr vs. ngtcp2: Z L1 C1 CM
neqo-pr vs. picoquic: Z A
neqo-pr vs. quic-go: A
neqo-pr vs. quiche: BP BA
neqo-pr vs. s2n-quic: CM
neqo-pr vs. tquic: S BP BA
neqo-pr vs. xquic: S R Z A L1 C1
aioquic vs. neqo-pr: CM
go-x-net vs. neqo-pr: ⚠️BP CM
kwik vs. neqo-pr: BP BA CM
msquic vs. neqo-pr: CM
mvfst vs. neqo-pr: Z L1 C1 CM
neqo vs. neqo-pr: Z A
ngtcp2 vs. neqo-pr: ⚠️L1
openssl vs. neqo-pr: LR M A CM
quic-go vs. neqo-pr: CM
quiche vs. neqo-pr: CM
quinn vs. neqo-pr: 🚀C1 ⚠️L1 V2 CM
s2n-quic vs. neqo-pr: CM
tquic vs. neqo-pr: CM
xquic vs. neqo-pr: M CM
All results

Succeeded Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

Unsupported Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

@github-actions

Copy link
Copy Markdown
Contributor

Client/server transfer results

Performance differences relative to 7f57f2c.

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server Mean±σ Min–Max Median±MAD MiB/s±σ ΔMedian
google-neqo-cubic 69.2 ± 0.4 68.4 – 70.3 69.2 ± 0.4 462.3 ± 2.4 💔 +0.8 (+1.1%)
neqo-neqo-cubic 19.2 ± 0.2 18.8 – 19.8 19.2 ± 0.2 1663.5 ± 14.4 💚 -0.6 (-3.2%)
neqo-neqo-cubic-nopacing 18.6 ± 0.2 18.2 – 19.0 18.6 ± 0.2 1718.1 ± 14.8 💚 -0.7 (-3.7%)
neqo-neqo-newreno 19.5 ± 0.1 19.1 – 19.9 19.6 ± 0.2 1638.4 ± 12.4 💚 -0.6 (-2.9%)
neqo-neqo-newreno-nopacing 18.8 ± 0.2 18.4 – 19.5 18.8 ± 0.1 1701.4 ± 13.9 💚 -0.4 (-2.2%)
quiche-neqo-cubic 38.0 ± 0.4 37.2 – 39.7 37.9 ± 0.3 841.3 ± 9.7 💔 +0.6 (+1.5%)

Table above only shows statistically significant changes. See all results below.

All results

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server Mean±σ Min–Max Median±MAD MiB/s±σ ΔMedian
google-google 131.7 ± 0.5 130.5 – 132.9 131.6 ± 0.4 243.0 ± 0.9
google-neqo-cubic 69.2 ± 0.4 68.4 – 70.3 69.2 ± 0.4 462.3 ± 2.4 💔 +0.8 (+1.1%)
neqo-google-cubic 232.4 ± 47.3 176.5 – 477.1 226.5 ± 26.3 137.7 ± 28.1 +9.1 (+4.2%)
neqo-neqo-cubic 19.2 ± 0.2 18.8 – 19.8 19.2 ± 0.2 1663.5 ± 14.4 💚 -0.6 (-3.2%)
neqo-neqo-cubic-nopacing 18.6 ± 0.2 18.2 – 19.0 18.6 ± 0.2 1718.1 ± 14.8 💚 -0.7 (-3.7%)
neqo-neqo-newreno 19.5 ± 0.1 19.1 – 19.9 19.6 ± 0.2 1638.4 ± 12.4 💚 -0.6 (-2.9%)
neqo-neqo-newreno-nopacing 18.8 ± 0.2 18.4 – 19.5 18.8 ± 0.1 1701.4 ± 13.9 💚 -0.4 (-2.2%)
neqo-quiche-cubic 33.7 ± 0.3 33.0 – 34.4 33.7 ± 0.3 950.2 ± 8.5 -0.0 (-0.1%)
neqo-s2n-cubic 38.3 ± 0.2 37.9 – 38.6 38.3 ± 0.2 835.7 ± 3.4 +0.0 (+0.1%)
quiche-neqo-cubic 38.0 ± 0.4 37.2 – 39.7 37.9 ± 0.3 841.3 ± 9.7 💔 +0.6 (+1.5%)
quiche-quiche 39.5 ± 0.2 38.9 – 40.0 39.5 ± 0.3 810.0 ± 4.7
s2n-neqo-cubic 112.3 ± 0.5 111.3 – 114.2 112.2 ± 0.3 285.0 ± 1.2 +0.1 (+0.1%)
s2n-s2n ⚠️ 159.7 ± 19.1 134.2 – 257.2 158.6 ± 0.6 200.4 ± 24.0

Download data for profiler.firefox.com or download performance comparison data.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark results

No significant performance differences relative to 7f57f2c.

All results
transfer/1-conn/1-100mb-req (aka. Upload)/mtu-1500
       time:   [49.350 ms 49.460 ms 49.588 ms]
       thrpt:  [1.9693 GiB/s 1.9745 GiB/s 1.9788 GiB/s]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1500
       time:   [49.609 ms 49.663 ms 49.720 ms]
       thrpt:  [1.9641 GiB/s 1.9664 GiB/s 1.9685 GiB/s]
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe
transfer/1-conn/1-1b-resp (aka. HPS)/mtu-1500
       time:   [2.9594 ms 2.9608 ms 2.9623 ms]
       thrpt:  [337.58   B/s 337.74   B/s 337.91   B/s]
Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) low mild
2 (2.00%) high mild
transfer/1-conn/10_000-parallel-1b-resp (aka. RPS)/mtu-1500
       time:   [65.170 ms 65.490 ms 65.815 ms]
       thrpt:  [151.94 Kelem/s 152.69 Kelem/s 153.44 Kelem/s]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
streams-flow-controlled/walltime/1-streams/each-4194304-bytes
       time:   [10.658 ms 10.661 ms 10.664 ms]
       thrpt:  [375.09 MiB/s 375.20 MiB/s 375.31 MiB/s]
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
streams-flow-controlled/walltime/10-streams/each-1048576-bytes
       time:   [28.563 ms 28.576 ms 28.588 ms]
       thrpt:  [349.79 MiB/s 349.95 MiB/s 350.10 MiB/s]
Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) high mild
streams/walltime/1-streams/each-1000-bytes
       time:   [129.37 µs 129.93 µs 130.65 µs]
       thrpt:  [7.2996 MiB/s 7.3398 MiB/s 7.3715 MiB/s]
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
streams/walltime/1000-streams/each-1-bytes
       time:   [3.8853 ms 3.8961 ms 3.9066 ms]
       thrpt:  [249.98 KiB/s 250.65 KiB/s 251.35 KiB/s]
streams/walltime/1000-streams/each-1000-bytes
       time:   [12.335 ms 12.344 ms 12.353 ms]
       thrpt:  [77.204 MiB/s 77.260 MiB/s 77.315 MiB/s]
transfer/walltime/pacing-false/same-seed
       time:   [2.0086 ms 2.0100 ms 2.0117 ms]
       thrpt:  [1.9418 GiB/s 1.9434 GiB/s 1.9448 GiB/s]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
transfer/walltime/pacing-false/varying-seeds
       time:   [2.0616 ms 2.0627 ms 2.0640 ms]
       thrpt:  [1.8926 GiB/s 1.8937 GiB/s 1.8948 GiB/s]
transfer/walltime/pacing-true/same-seed
       time:   [2.0686 ms 2.0697 ms 2.0709 ms]
       thrpt:  [1.8862 GiB/s 1.8874 GiB/s 1.8884 GiB/s]
transfer/walltime/pacing-true/varying-seeds
       time:   [2.0435 ms 2.0443 ms 2.0451 ms]
       thrpt:  [1.9100 GiB/s 1.9108 GiB/s 1.9115 GiB/s]
Found 4 outliers among 100 measurements (4.00%)
4 (4.00%) high mild

Instructions per cycle

Criterion reported no significant timing changes.

All benchmarks
Benchmark IPC before IPC after ΔIPC
streams/walltime/1000-streams/each-1000-bytes 3.06 3.00 -1.9%
streams-flow-controlled/walltime/10-streams/each-1048576-bytes 3.13 3.17 +1.1%
transfer/1-conn/1-100mb-req (aka. Upload)/mtu-1500 3.15 3.17 +0.8%
transfer/1-conn/10_000-parallel-1b-resp (aka. RPS)/mtu-1500 3.17 3.19 +0.6%
transfer/walltime/pacing-false/varying-seeds 2.87 2.89 +0.5%
transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1500 3.19 3.21 +0.5%
transfer/walltime/pacing-true/varying-seeds 2.88 2.89 +0.5%
transfer/walltime/pacing-true/same-seed 2.89 2.88 -0.3%
streams/walltime/1-streams/each-1000-bytes 2.54 2.54 +0.1%
transfer/1-conn/1-1b-resp (aka. HPS)/mtu-1500 2.24 2.25 +0.1%
streams/walltime/1000-streams/each-1-bytes 3.28 3.27 -0.1%
streams-flow-controlled/walltime/1-streams/each-4194304-bytes 2.98 2.98 +0.1%
transfer/walltime/pacing-false/same-seed 2.88 2.88 -0.0%
Profiles for profiler.firefox.com (62)

Download data for profiler.firefox.com or download performance comparison data.

Comment on lines +198 to +206
/// A burst exceeding the byte budget, with a mix of send-order priorities,
/// must evict low-priority datagrams to make room for high-priority ones -
/// verified through the real `Http3Client` API and a live connection, not
/// just on a bare `DatagramQueue` in isolation. `DatagramQueueOutcome::Overflowed`
/// reports only how many were evicted, not which ones, so identity is
/// checked the same way the receiving peer would: by which content (each
/// datagram's payload is its own id, as 8 little-endian bytes) actually
/// arrives - checked against whatever has been delivered so far, since a
/// full drain of a backlog this size isn't practical in one exchange.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
/// A burst exceeding the byte budget, with a mix of send-order priorities,
/// must evict low-priority datagrams to make room for high-priority ones -
/// verified through the real `Http3Client` API and a live connection, not
/// just on a bare `DatagramQueue` in isolation. `DatagramQueueOutcome::Overflowed`
/// reports only how many were evicted, not which ones, so identity is
/// checked the same way the receiving peer would: by which content (each
/// datagram's payload is its own id, as 8 little-endian bytes) actually
/// arrives - checked against whatever has been delivered so far, since a
/// full drain of a backlog this size isn't practical in one exchange.
/// A burst exceeding the byte budget, with a mix of send-order priorities,
/// must evict low-priority datagrams to make room for high-priority ones.

The why is important, the how is documented through the test itself.

@jesup

jesup commented Sep 29, 2026

Copy link
Copy Markdown
Member Author

Landed as part of #4003 (squash-merged in 9d7e35b).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants