Skip to content

Conversation

@mxinden
Copy link
Member

@mxinden mxinden commented Dec 5, 2025

Needed for #3208.

@codecov
Copy link

codecov bot commented Dec 5, 2025

Codecov Report

❌ Patch coverage is 66.66667% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 93.46%. Comparing base (d070393) to head (fffd8c1).
⚠️ Report is 21 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3209      +/-   ##
==========================================
- Coverage   93.49%   93.46%   -0.04%     
==========================================
  Files         125      125              
  Lines       36674    36677       +3     
  Branches    36674    36677       +3     
==========================================
- Hits        34290    34280      -10     
- Misses       1540     1553      +13     
  Partials      844      844              
Components Coverage Δ
neqo-common 97.36% <ø> (ø)
neqo-crypto 83.17% <ø> (-0.49%) ⬇️
neqo-http3 93.30% <ø> (ø)
neqo-qpack 94.40% <ø> (ø)
neqo-transport 94.59% <66.66%> (-0.02%) ⬇️
neqo-udp 79.42% <ø> (+0.47%) ⬆️
mtu 85.26% <ø> (-0.19%) ⬇️

@mxinden mxinden marked this pull request as ready for review December 5, 2025 12:38
@mxinden mxinden requested a review from KershawChang as a code owner December 5, 2025 12:38
Copilot AI review requested due to automatic review settings December 5, 2025 12:38
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds a debug assertion to the flow control code to detect unexpected underflow conditions during max_active value updates. The assertion helps diagnose issue #3208 by catching cases where max_active decreases when it shouldn't, providing detailed debug information when the assertion fails.

Key Changes

  • Added a debug_assert! in the flow control update logic to verify that max_active never decreases relative to its previous value
  • Included comprehensive debug context (self state, timing, RTT, max_window, subject) in the assertion message for troubleshooting

@github-actions
Copy link
Contributor

github-actions bot commented Dec 5, 2025

Client/server transfer results

Performance differences relative to d070393.

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

Client vs. server (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
neqo-google-cubic 757.9 ± 4.9 750.7 770.4 42.2 ± 6.5 💔 2.9 0.4%
neqo-neqo-cubic 96.8 ± 3.9 87.9 106.1 330.7 ± 8.2 💚 -2.3 -2.4%
s2n-neqo-cubic 170.7 ± 5.0 163.6 194.9 187.4 ± 6.4 💚 -2.4 -1.4%

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 (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
google-google-nopacing 453.7 ± 3.6 448.1 465.6 70.5 ± 8.9
google-neqo-cubic 277.5 ± 4.3 268.9 289.4 115.3 ± 7.4 -0.9 -0.3%
msquic-msquic-nopacing 186.9 ± 71.0 136.9 493.5 171.2 ± 0.5
msquic-neqo-cubic 202.3 ± 50.7 141.0 374.1 158.2 ± 0.6 -14.0 -6.5%
neqo-google-cubic 757.9 ± 4.9 750.7 770.4 42.2 ± 6.5 💔 2.9 0.4%
neqo-msquic-cubic 157.4 ± 4.0 150.9 167.4 203.3 ± 8.0 -0.9 -0.5%
neqo-neqo-cubic 96.8 ± 3.9 87.9 106.1 330.7 ± 8.2 💚 -2.3 -2.4%
neqo-neqo-cubic-nopacing 97.3 ± 4.4 87.6 105.3 328.8 ± 7.3 1.2 1.2%
neqo-neqo-reno 98.3 ± 4.9 88.3 122.0 325.5 ± 6.5 0.7 0.7%
neqo-neqo-reno-nopacing 95.3 ± 4.2 89.3 104.4 335.7 ± 7.6 -0.4 -0.4%
neqo-quiche-cubic 190.1 ± 3.4 186.2 202.3 168.4 ± 9.4 0.5 0.3%
neqo-s2n-cubic 222.7 ± 4.1 213.5 230.9 143.7 ± 7.8 1.0 0.4%
quiche-neqo-cubic 155.0 ± 4.6 145.3 162.8 206.5 ± 7.0 -0.3 -0.2%
quiche-quiche-nopacing 144.0 ± 4.4 138.6 158.1 222.2 ± 7.3
s2n-neqo-cubic 170.7 ± 5.0 163.6 194.9 187.4 ± 6.4 💚 -2.4 -1.4%
s2n-s2n-nopacing 243.4 ± 14.1 231.7 340.3 131.5 ± 2.3

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

@github-actions
Copy link
Contributor

github-actions bot commented Dec 5, 2025

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to d070393.

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

Succeeded Interop Tests

QUIC Interop Runner, client vs. server

neqo-latest as client

neqo-latest as server

Unsupported Interop Tests

QUIC Interop Runner, client vs. server

neqo-latest as client

neqo-latest as server

@github-actions
Copy link
Contributor

github-actions bot commented Dec 5, 2025

Benchmark results

Significant performance differences relative to d070393.

1-conn/10_000-parallel-1b-resp/mtu-1504 (aka. RPS)/client: 💔 Performance has regressed by +2.1036%.
       time:   [285.14 ms 287.22 ms 289.31 ms]
       thrpt:  [34.564 Kelem/s 34.817 Kelem/s 35.070 Kelem/s]
change:
       time:   [+1.0892% +2.1036% +3.1037] (p = 0.00 < 0.05)
       thrpt:  [-3.0103% -2.0603% -1.0775]
       Performance has regressed.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
All results
1-conn/1-100mb-resp/mtu-1504 (aka. Download)/client: No change in performance detected.
       time:   [206.73 ms 207.02 ms 207.32 ms]
       thrpt:  [482.34 MiB/s 483.04 MiB/s 483.72 MiB/s]
change:
       time:   [-0.2941% +0.0503% +0.3376] (p = 0.77 > 0.05)
       thrpt:  [-0.3364% -0.0502% +0.2950]
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1-conn/10_000-parallel-1b-resp/mtu-1504 (aka. RPS)/client: 💔 Performance has regressed by +2.1036%.
       time:   [285.14 ms 287.22 ms 289.31 ms]
       thrpt:  [34.564 Kelem/s 34.817 Kelem/s 35.070 Kelem/s]
change:
       time:   [+1.0892% +2.1036% +3.1037] (p = 0.00 < 0.05)
       thrpt:  [-3.0103% -2.0603% -1.0775]
       Performance has regressed.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
1-conn/1-1b-resp/mtu-1504 (aka. HPS)/client: No change in performance detected.
       time:   [38.486 ms 38.642 ms 38.824 ms]
       thrpt:  [25.757   B/s 25.878   B/s 25.984   B/s]
change:
       time:   [-1.0187% -0.3679% +0.2949] (p = 0.28 > 0.05)
       thrpt:  [-0.2940% +0.3692% +1.0291]
       No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
2 (2.00%) high mild
5 (5.00%) high severe
1-conn/1-100mb-req/mtu-1504 (aka. Upload)/client: Change within noise threshold.
       time:   [212.24 ms 212.59 ms 212.97 ms]
       thrpt:  [469.56 MiB/s 470.40 MiB/s 471.16 MiB/s]
change:
       time:   [+0.7692% +1.1783% +1.5064] (p = 0.00 < 0.05)
       thrpt:  [-1.4840% -1.1646% -0.7633]
       Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high severe
decode 4096 bytes, mask ff: No change in performance detected.
       time:   [11.331 µs 11.374 µs 11.422 µs]
       change: [-0.7854% -0.2529% +0.2478] (p = 0.36 > 0.05)
       No change in performance detected.
Found 16 outliers among 100 measurements (16.00%)
3 (3.00%) low severe
2 (2.00%) low mild
1 (1.00%) high mild
10 (10.00%) high severe
decode 1048576 bytes, mask ff: No change in performance detected.
       time:   [2.9955 ms 3.0051 ms 3.0163 ms]
       change: [-0.3333% +0.1563% +0.5975] (p = 0.53 > 0.05)
       No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
10 (10.00%) high severe
decode 4096 bytes, mask 7f: No change in performance detected.
       time:   [19.580 µs 19.638 µs 19.702 µs]
       change: [-0.4748% -0.0716% +0.3323] (p = 0.74 > 0.05)
       No change in performance detected.
Found 14 outliers among 100 measurements (14.00%)
3 (3.00%) low mild
1 (1.00%) high mild
10 (10.00%) high severe
decode 1048576 bytes, mask 7f: No change in performance detected.
       time:   [5.0319 ms 5.0498 ms 5.0730 ms]
       change: [-0.3586% +0.1003% +0.6433] (p = 0.71 > 0.05)
       No change in performance detected.
Found 14 outliers among 100 measurements (14.00%)
14 (14.00%) high severe
decode 4096 bytes, mask 3f: No change in performance detected.
       time:   [6.2001 µs 6.2209 µs 6.2492 µs]
       change: [-0.5434% +0.2025% +0.9851] (p = 0.64 > 0.05)
       No change in performance detected.
Found 15 outliers among 100 measurements (15.00%)
5 (5.00%) low mild
4 (4.00%) high mild
6 (6.00%) high severe
decode 1048576 bytes, mask 3f: No change in performance detected.
       time:   [1.7582 ms 1.7639 ms 1.7715 ms]
       change: [-0.2923% +0.1819% +0.6895] (p = 0.53 > 0.05)
       No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
2 (2.00%) high mild
4 (4.00%) high severe
1-streams/each-1000-bytes/wallclock-time: No change in performance detected.
       time:   [583.23 µs 585.50 µs 588.02 µs]
       change: [-0.7770% -0.2457% +0.2777] (p = 0.38 > 0.05)
       No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
9 (9.00%) high severe
1-streams/each-1000-bytes/simulated-time: No change in performance detected.
       time:   [118.79 ms 119.02 ms 119.25 ms]
       thrpt:  [8.1891 KiB/s 8.2047 KiB/s 8.2208 KiB/s]
change:
       time:   [-0.3676% -0.1029% +0.1713] (p = 0.46 > 0.05)
       thrpt:  [-0.1710% +0.1030% +0.3690]
       No change in performance detected.
1000-streams/each-1-bytes/wallclock-time: No change in performance detected.
       time:   [12.324 ms 12.364 ms 12.403 ms]
       change: [-0.6860% -0.2386% +0.1597] (p = 0.28 > 0.05)
       No change in performance detected.
1000-streams/each-1-bytes/simulated-time: No change in performance detected.
       time:   [2.3254 s 2.3293 s 2.3333 s]
       thrpt:  [428.58   B/s 429.31   B/s 430.03   B/s]
change:
       time:   [-0.3250% -0.1207% +0.0844] (p = 0.25 > 0.05)
       thrpt:  [-0.0844% +0.1209% +0.3261]
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1000-streams/each-1000-bytes/wallclock-time: Change within noise threshold.
       time:   [49.651 ms 49.763 ms 49.877 ms]
       change: [-0.7194% -0.4011% -0.0709] (p = 0.02 < 0.05)
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1000-streams/each-1000-bytes/simulated-time: No change in performance detected.
       time:   [16.267 s 16.516 s 16.768 s]
       thrpt:  [58.240 KiB/s 59.127 KiB/s 60.035 KiB/s]
change:
       time:   [-1.8918% +0.2367% +2.5106] (p = 0.83 > 0.05)
       thrpt:  [-2.4491% -0.2361% +1.9283]
       No change in performance detected.
coalesce_acked_from_zero 1+1 entries: No change in performance detected.
       time:   [89.095 ns 89.375 ns 89.664 ns]
       change: [-0.4092% +0.0384% +0.4978] (p = 0.86 > 0.05)
       No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
7 (7.00%) high mild
3 (3.00%) high severe
coalesce_acked_from_zero 3+1 entries: No change in performance detected.
       time:   [105.78 ns 106.07 ns 106.39 ns]
       change: [-0.4078% -0.0084% +0.3758] (p = 0.97 > 0.05)
       No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
10 (10.00%) high severe
coalesce_acked_from_zero 10+1 entries: No change in performance detected.
       time:   [105.44 ns 106.06 ns 106.93 ns]
       change: [+0.1770% +1.2525% +2.8566] (p = 0.05 > 0.05)
       No change in performance detected.
Found 13 outliers among 100 measurements (13.00%)
2 (2.00%) low severe
2 (2.00%) low mild
9 (9.00%) high severe
coalesce_acked_from_zero 1000+1 entries: No change in performance detected.
       time:   [91.230 ns 91.333 ns 91.455 ns]
       change: [-0.7059% -0.1313% +0.4484] (p = 0.67 > 0.05)
       No change in performance detected.
Found 16 outliers among 100 measurements (16.00%)
5 (5.00%) high mild
11 (11.00%) high severe
RxStreamOrderer::inbound_frame(): No change in performance detected.
       time:   [109.32 ms 109.52 ms 109.84 ms]
       change: [-0.6058% -0.2860% +0.0205] (p = 0.07 > 0.05)
       No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
2 (2.00%) low mild
1 (1.00%) high mild
3 (3.00%) high severe
sent::Packets::take_ranges: No change in performance detected.
       time:   [4.3984 µs 4.4841 µs 4.5564 µs]
       change: [-3.2373% -0.3348% +2.8364] (p = 0.83 > 0.05)
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
transfer/pacing-false/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [25.034 ms 25.070 ms 25.107 ms]
       change: [-1.2690% -1.0488% -0.8379] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
transfer/pacing-false/varying-seeds/simulated-time/run: No change in performance detected.
       time:   [25.153 s 25.188 s 25.223 s]
       thrpt:  [162.39 KiB/s 162.62 KiB/s 162.84 KiB/s]
change:
       time:   [-0.1276% +0.0627% +0.2657] (p = 0.53 > 0.05)
       thrpt:  [-0.2650% -0.0626% +0.1277]
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
transfer/pacing-true/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [25.474 ms 25.513 ms 25.556 ms]
       change: [-0.6246% -0.3942% -0.1761] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
transfer/pacing-true/varying-seeds/simulated-time/run: Change within noise threshold.
       time:   [24.886 s 24.924 s 24.961 s]
       thrpt:  [164.10 KiB/s 164.34 KiB/s 164.59 KiB/s]
change:
       time:   [+0.0271% +0.2288% +0.4403] (p = 0.03 < 0.05)
       thrpt:  [-0.4383% -0.2283% -0.0271]
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
transfer/pacing-false/same-seed/wallclock-time/run: Change within noise threshold.
       time:   [24.915 ms 24.982 ms 25.049 ms]
       change: [-0.6906% -0.3720% -0.0602] (p = 0.02 < 0.05)
       Change within noise threshold.
transfer/pacing-false/same-seed/simulated-time/run: No change in performance detected.
       time:   [25.234 s 25.234 s 25.234 s]
       thrpt:  [162.32 KiB/s 162.32 KiB/s 162.32 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/pacing-true/same-seed/wallclock-time/run: Change within noise threshold.
       time:   [25.706 ms 25.735 ms 25.778 ms]
       change: [+0.6641% +0.9201% +1.1566] (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 severe
transfer/pacing-true/same-seed/simulated-time/run: No change in performance detected.
       time:   [25.207 s 25.207 s 25.207 s]
       thrpt:  [162.50 KiB/s 162.50 KiB/s 162.50 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.

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

@mxinden
Copy link
Member Author

mxinden commented Dec 5, 2025

codecov/patch
codecov/patch — 66.66% of diff hit (target 93.49%)

If I only knew how to hit it, I wouldn't need the debug_assert!.

@larseggert would you mind merging manually? I don't have the permissions.

@larseggert larseggert enabled auto-merge December 5, 2025 15:05
@larseggert larseggert disabled auto-merge December 5, 2025 15:05
@larseggert larseggert merged commit 1830662 into mozilla:main Dec 5, 2025
103 of 144 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants