Support WebTransport anticipatedStreams#3473
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds a WebTransport-facing API to declare anticipated incoming stream concurrency per session and plumbs that through to QUIC MAX_STREAMS updates so the peer can open more streams than the handshake baseline.
Changes:
- Add transport-layer setters to update advertised remote stream limits (uni/bidi) via
MAX_STREAMS. - Track per-session anticipated uni/bidi incoming counts and sum them across sessions to drive connection-level stream limits.
- Add WebTransport tests validating when
MAX_STREAMSframes are (and are not) sent.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| neqo-transport/src/streams.rs | Adds setters to update remote stream limits for uni/bidi streams. |
| neqo-transport/src/fc.rs | Documents intended set_max_active behavior related to monotonic limit updates. |
| neqo-transport/src/connection/params.rs | Updates docs for baseline stream limits and how they can be increased post-handshake. |
| neqo-transport/src/connection/mod.rs | Exposes connection-level setters for remote max streams (uni/bidi). |
| neqo-http3/src/features/extended_connect/tests/webtransport/mod.rs | Wires in the new anticipated-streams test module. |
| neqo-http3/src/features/extended_connect/tests/webtransport/anticipated_streams.rs | New tests for anticipated stream APIs and MAX_STREAMS transmission behavior. |
| neqo-http3/src/features/extended_connect/session.rs | Stores per-session anticipated incoming uni/bidi counts with accessors. |
| neqo-http3/src/connection_client.rs | Adds public Http3Client API methods to set anticipated incoming stream counts. |
| neqo-http3/src/connection.rs | Implements the handlers that store anticipated values and sum across sessions to update transport limits. |
mxinden
left a comment
There was a problem hiding this comment.
I am missing context. What is the goal of this feature? What does it enable applications to do?
Note that, in case we ever run multiple sessions and HTTP/3 requests on the same connection, a single session could choose the global limit, by setting its session limit, which propagates to a global limit.
martinthomson
left a comment
There was a problem hiding this comment.
This change is not what I would have expected from this one. The goal of this is to ensure that the flow control allocation for streams is generous enough that the server can make streams without getting blocked. To that end, this should route the message through to the max_active value on the relevant ReceiverFlowControl instance.
There is also the potential for this input to be fed to ConnectionParameters::max_streams() if the connection has not been created yet. That is a matter for the neqo glue code in Firefox.
In terms of spelling, this can use a better name than the one in the WT spec. set_active_streams or increase_max_active_streams...
9fdf5e7 to
2f30ddf
Compare
225f726 to
3dba9cd
Compare
|
This PR is part of a stack of 16 bookmarks:
Created with jj-stack |
|
Perhaps this is closer to what you expected |
2f30ddf to
3158648
Compare
3dba9cd to
d989fa5
Compare
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## users/jesup/avoid_PMTUD #3473 +/- ##
===========================================================
+ Coverage 94.38% 94.42% +0.03%
===========================================================
Files 118 118
Lines 39911 40014 +103
Branches 39911 40014 +103
===========================================================
+ Hits 37671 37783 +112
+ Misses 1501 1491 -10
- Partials 739 740 +1
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
bf42e35 to
dc0bb12
Compare
c857318 to
3907c3a
Compare
dc0bb12 to
67055f7
Compare
3907c3a to
da96451
Compare
67055f7 to
a025db5
Compare
da96451 to
ba77b24
Compare
martinthomson
left a comment
There was a problem hiding this comment.
I'm not sure about the logic here. If we are giving a session streams up to the limit they request, shouldn't we be policing their use of that stream limit?
And what about defaults? You are setting the default value to 0, which
a025db5 to
1107cbc
Compare
ba77b24 to
2f2d647
Compare
Merging this PR will not alter performance
Comparing Footnotes
|
5944692 to
02a84ce
Compare
5219430 to
a510503
Compare
02a84ce to
77287f4
Compare
a510503 to
41d0722
Compare
77287f4 to
fe4fae4
Compare
41d0722 to
921ea46
Compare
As best I can tell all requests have been resolved; I'll re-request review
fe4fae4 to
480e253
Compare
921ea46 to
67b7d62
Compare
Failed Interop TestsQUIC Interop Runner, client vs. server, differences relative to
All resultsSucceeded Interop TestsQUIC Interop Runner, client vs. server neqo-pr as client
neqo-pr as server
Unsupported Interop TestsQUIC Interop Runner, client vs. server neqo-pr as client
neqo-pr as server
|
480e253 to
008832e
Compare
67b7d62 to
ef16d86
Compare
008832e to
e61549c
Compare
ef16d86 to
406be9c
Compare
Benchmark resultsSignificant performance differences relative to e61549c. streams/walltime/1000-streams/each-1000-bytes: 💔 Performance has regressed by +1.9239%. time: [40.376 ms 40.427 ms 40.478 ms]
change: [+1.7540% +1.9239% +2.1042] (p = 0.00 < 0.05)
Performance has regressed.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mildstreams-flow-controlled/walltime/1-streams/each-4194304-bytes: 💔 Performance has regressed by +2.4309%. time: [34.562 ms 34.618 ms 34.675 ms]
change: [+2.1993% +2.4309% +2.6550] (p = 0.00 < 0.05)
Performance has regressed.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mildstreams-flow-controlled/walltime/10-streams/each-1048576-bytes: 💔 Performance has regressed by +1.9914%. time: [93.068 ms 93.448 ms 93.891 ms]
change: [+1.2986% +1.9914% +2.6825] (p = 0.00 < 0.05)
Performance has regressed.
Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) low severe
2 (2.00%) high severeAll resultstransfer/1-conn/1-100mb-resp (aka. Download): Change within noise threshold. time: [166.61 ms 167.01 ms 167.42 ms]
thrpt: [597.29 MiB/s 598.78 MiB/s 600.19 MiB/s]
change:
time: [+0.1780% +0.5057% +0.8477] (p = 0.00 < 0.05)
thrpt: [-0.8405% -0.5031% -0.1777]
Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severetransfer/1-conn/10_000-parallel-1b-resp (aka. RPS): No change in performance detected. time: [270.14 ms 272.03 ms 273.93 ms]
thrpt: [36.506 Kelem/s 36.760 Kelem/s 37.018 Kelem/s]
change:
time: [-1.3979% -0.5005% +0.4858] (p = 0.31 > 0.05)
thrpt: [-0.4835% +0.5030% +1.4177]
No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) low mild
1 (1.00%) high mildtransfer/1-conn/1-1b-resp (aka. HPS): No change in performance detected. time: [38.504 ms 38.686 ms 38.889 ms]
thrpt: [25.714 B/s 25.849 B/s 25.972 B/s]
change:
time: [-0.5118% +0.1277% +0.8180] (p = 0.70 > 0.05)
thrpt: [-0.8114% -0.1275% +0.5144]
No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
8 (8.00%) high severetransfer/1-conn/1-100mb-req (aka. Upload): Change within noise threshold. time: [169.32 ms 169.68 ms 170.11 ms]
thrpt: [587.86 MiB/s 589.33 MiB/s 590.58 MiB/s]
change:
time: [-1.3055% -1.0279% -0.7444] (p = 0.00 < 0.05)
thrpt: [+0.7500% +1.0386% +1.3228]
Change within noise threshold.
Found 5 outliers among 100 measurements (5.00%)
3 (3.00%) low mild
2 (2.00%) high severestreams/walltime/1-streams/each-1000-bytes: No change in performance detected. time: [572.76 µs 575.02 µs 577.64 µs]
change: [-0.5237% +0.0492% +0.7009] (p = 0.87 > 0.05)
No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
2 (2.00%) high mild
9 (9.00%) high severestreams/walltime/1000-streams/each-1-bytes: No change in performance detected. time: [11.877 ms 11.908 ms 11.947 ms]
change: [-0.2417% +0.0736% +0.4315] (p = 0.68 > 0.05)
No change in performance detected.
Found 4 outliers among 100 measurements (4.00%)
3 (3.00%) high mild
1 (1.00%) high severestreams/walltime/1000-streams/each-1000-bytes: 💔 Performance has regressed by +1.9239%. time: [40.376 ms 40.427 ms 40.478 ms]
change: [+1.7540% +1.9239% +2.1042] (p = 0.00 < 0.05)
Performance has regressed.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mildstreams-flow-controlled/walltime/1-streams/each-4194304-bytes: 💔 Performance has regressed by +2.4309%. time: [34.562 ms 34.618 ms 34.675 ms]
change: [+2.1993% +2.4309% +2.6550] (p = 0.00 < 0.05)
Performance has regressed.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mildstreams-flow-controlled/walltime/10-streams/each-1048576-bytes: 💔 Performance has regressed by +1.9914%. time: [93.068 ms 93.448 ms 93.891 ms]
change: [+1.2986% +1.9914% +2.6825] (p = 0.00 < 0.05)
Performance has regressed.
Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) low severe
2 (2.00%) high severetransfer/walltime/pacing-false/varying-seeds: Change within noise threshold. time: [18.736 ms 18.761 ms 18.800 ms]
change: [-1.2946% -1.0323% -0.7614] (p = 0.00 < 0.05)
Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severetransfer/walltime/pacing-true/varying-seeds: Change within noise threshold. time: [19.205 ms 19.232 ms 19.275 ms]
change: [-0.8722% -0.6203% -0.3578] (p = 0.00 < 0.05)
Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
5 (5.00%) high mild
1 (1.00%) high severetransfer/walltime/pacing-false/same-seed: Change within noise threshold. time: [18.876 ms 18.894 ms 18.917 ms]
change: [-1.3876% -1.1824% -1.0060] (p = 0.00 < 0.05)
Change within noise threshold.
Found 11 outliers among 100 measurements (11.00%)
5 (5.00%) low mild
3 (3.00%) high mild
3 (3.00%) high severetransfer/walltime/pacing-true/same-seed: Change within noise threshold. time: [19.442 ms 19.459 ms 19.479 ms]
change: [+0.0392% +0.1772% +0.3137] (p = 0.01 < 0.05)
Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severeDownload data for |
Client/server transfer resultsPerformance differences relative to e61549c. Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.
Table above only shows statistically significant changes. See all results below. All resultsTransfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.
Download data for |
No description provided.