Skip to content

WebTransport: count a session's expired outgoing datagrams - #3986

Open
jesup wants to merge 1 commit into
users/jesup/rename_max_buffered_datagramsfrom
users/jesup/expire_datagrams
Open

jesup wants to merge 1 commit into
users/jesup/rename_max_buffered_datagramsfrom
users/jesup/expire_datagrams

Conversation

@jesup

@jesup jesup commented Sep 14, 2026 •

Copy link
Copy Markdown
Member
Implement Protocol::record_expired_outgoing_datagrams on the WebTransport
session, so SessionStats::datagrams_expired_outgoing counts datagrams shed
for exceeding outgoingMaxAge; the field existed but stayed zero.

The HTTP/3 layer picks the counts up in its per-session sweep, and
close_session collects any still pending before returning the final stats.
Add Connection::next_datagram_expiry so the sweep can skip scanning the
receive streams when nothing is due.

A session the peer closes drops its queue as soon as it leaves the active
state; a close capsule without a FIN would otherwise leave the queue in
place until the FIN arrives.  Datagrams still queued when a session closes
are dropped, not counted as expired.

@jesup

jesup commented Sep 14, 2026 •

Copy link
Copy Markdown
Member Author

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

One or more issues must be addressed before approval.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Wires outgoing WebTransport datagram expiry into HTTP/3 processing and records expiry statistics.

Changes:

  • Expire datagram queues during client and server processing.
  • Track expired outgoing datagrams in WebTransport stats.
  • Add regression coverage and update documentation.
File summaries
File Description
neqo-http3/src/features/extended_connect/webtransport_session.rs Updated as part of this pull request.
neqo-http3/src/features/extended_connect/tests/webtransport/datagrams.rs Updated as part of this pull request.
neqo-http3/src/features/extended_connect/stats.rs Updated as part of this pull request.
neqo-http3/src/connection_server.rs Updated as part of this pull request.
neqo-http3/src/connection_client.rs Updated as part of this pull request.
Review details

Suppressed comments (4)

neqo-http3/src/connection_client.rs:750

  • This sweep is inside the active-state arm, so it does not run once the client enters Http3State::Closing. A peer-initiated close sets the HTTP/3 state to Closing without clearing the extended-CONNECT sessions, while the transport's process_timer also skips datagram expiry during closing; queued stale datagrams can therefore remain until the connection is dropped and are never counted. Run the sweep for every non-closed HTTP/3 tick, as the server path does.
                self.base_handler
                    .expire_datagram_queues(&mut self.conn, now);

neqo-http3/src/connection_client.rs:750

  • This activates a shared sweep whose accounting is not actually per session: Session::expire_datagrams calls conn.expire_datagrams(now), which expires every queue, while this helper invokes it once for each active session. With the multiple-session case already supported by datagrams_multiple_session, the first session visited consumes both sessions' stale datagrams and records both counts in its own SessionStats; the other session records zero. Make the transport sweep session-scoped (or return per-session counts) before using this call.
                self.base_handler
                    .expire_datagram_queues(&mut self.conn, now);

neqo-http3/src/connection_server.rs:198

  • This sweep is not reached for every server connection at each Http3Server::process_http3 call: the outer server only selects active_connections() or handlers whose should_be_processed() is true, and that predicate does not include a pending QUIC datagram queue. If a send attempt leaves a datagram queued until its expiry timer, the transport's Connection::process_timer can remove it before this handler is selected, so the WebTransport expiry statistic stays at zero. Select/sweep connections with a due datagram expiry before transport timer processing.
        self.base_handler.expire_datagram_queues(conn, now);

neqo-http3/src/features/extended_connect/webtransport_session.rs:251

  • This counter is intended to be per WebTransport session, but the sweep that calls this hook uses Connection::expire_datagrams, which removes stale entries from every session queue on the connection. With two active WebTransport sessions, whichever session is visited first records all expired datagrams and the other records zero (or the first records datagrams belonging only to the other session). Scope the expiry/counting to the current session, or return per-session counts before updating this field.
    fn record_expired_outgoing_datagrams(&mut self, count: u64) {
        self.stats.datagrams_expired_outgoing += count;
  • Files reviewed: 5/5 changed files
  • Comments generated: 1
  • Review effort level: Lite (auto)

Note

Copilot is running an experiment and ran this review at Lite.


💡 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/connection_server.rs
@codspeed

codspeed Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Merging this PR will degrade performance by 0.7%

⚡ 3 improved benchmarks
❌ 8 regressed benchmarks
✅ 88 untouched benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
❌ WallTime neqo-s2n 48.2 ms 49.8 ms -3.24%
❌ WallTime walltime/pacing-true/varying-seeds 2 ms 2.1 ms -3.11%
❌ WallTime walltime/pacing-true/same-seed 2 ms 2.1 ms -2.75%
❌ WallTime walltime/pacing-false/varying-seeds 2 ms 2.1 ms -2.57%
❌ WallTime walltime/1-streams/each-4194304-bytes 10.5 ms 10.8 ms -2.56%
❌ WallTime walltime/1-streams/each-1000-bytes 128.7 µs 132.1 µs -2.54%
❌ WallTime 1-conn/1-100mb-req (aka. Upload) 48 ms 49.3 ms -2.49%
❌ Simulation simulated/pacing-false/same-seed 75.7 ms 77.3 ms -2.12%
⚡ WallTime walltime/1000-streams/each-1000-bytes 12.4 ms 11.6 ms +6.75%
⚡ Simulation simulated/1000-streams/each-1000-bytes 182.1 ms 173.5 ms +4.95%
⚡ Simulation simulated/pacing-false/varying-seeds 75.2 ms 73.3 ms +2.57%

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/expire_datagrams (5dfb5fe) with main (9e79b5f)

Open in CodSpeed

@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 1f3c5c1 to 40b0996 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/expire_datagrams branch from d74cf65 to b3a3b72 Compare September 14, 2026 05:31
@codecov

codecov Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.01%. Comparing base (fdf2b5a) to head (1f13246).

Additional details and impacted files
@@                              Coverage Diff                              @@
##           users/jesup/rename_max_buffered_datagrams    #3986      +/-   ##
=============================================================================
+ Coverage                                      96.98%   97.01%   +0.03%     
=============================================================================
  Files                                            118      118              
  Lines                                          41441    41527      +86     
  Branches                                       41441    41527      +86     
=============================================================================
+ Hits                                           40190    40287      +97     
+ Misses                                          1227     1216      -11     
  Partials                                          24       24              
Flag Coverage Δ
freebsd 94.51% <97.67%> (+<0.01%) ⬆️
linux 97.22% <100.00%> (+0.03%) ⬆️
macos 95.34% <97.67%> (+<0.01%) ⬆️
windows 95.44% <97.67%> (+<0.01%) ⬆️

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

Components Coverage Δ
neqo-common 99.30% <ø> (ø)
neqo-http3 95.40% <100.00%> (+0.04%) ⬆️
neqo-qpack 96.94% <ø> (ø)
neqo-transport 98.04% <100.00%> (+0.04%) ⬆️
neqo-udp 95.37% <ø> (ø)
mtu 89.13% <ø> (ø)

@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 40b0996 to 95b5b8d Compare September 14, 2026 17:56
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from b3a3b72 to af3de7e Compare September 14, 2026 17:56
@mxinden

mxinden commented Sep 15, 2026

Copy link
Copy Markdown
Member

@jesup I don't think the PR title matches the code you are proposing here. This pull request only adds the reporting, no?

@jesup

jesup commented Sep 16, 2026

Copy link
Copy Markdown
Member Author

@jesup I don't think the PR title matches the code you are proposing here. This pull request only adds the reporting, no?

You're right, and I had already updated this locally - the commit is retitled here to "WebTransport: count a session's expired outgoing datagrams" since the process_http3 wiring moved to #3985 (so #3985 doesn't ship a sweep with no caller). Title will update once I push; sorry for the stale name

@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/expire_datagrams branch from af3de7e to 579205f Compare September 16, 2026 03:45
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from 4ba7feb to 31e9004 Compare September 25, 2026 12:35
@jesup
jesup force-pushed the users/jesup/remove_legacy_queue branch from d7b8b23 to 81b9830 Compare September 25, 2026 15:05
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from 31e9004 to 3a9684b Compare September 25, 2026 15:05
@mxinden

mxinden commented Sep 28, 2026

Copy link
Copy Markdown
Member

This pull request now includes #3988, right? If so, can you reply to my comment #3988 (review) ?

@jesup
jesup changed the base branch from users/jesup/remove_legacy_queue to main September 28, 2026 15:43
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from 3a9684b to 0fe78e4 Compare September 29, 2026 01:06

@github-actions github-actions Bot 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.

No whole-change observations.

Comment thread neqo-http3/src/connection_server.rs Outdated
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from 0fe78e4 to a0174a1 Compare September 29, 2026 05:24

@github-actions github-actions Bot 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.

I found nothing new. The only defect found, peer-closed sessions making should_be_processed() return true on every tick, is already raised in an existing review thread.

@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from a0174a1 to 40e8b3a Compare September 29, 2026 14:51

@github-actions github-actions Bot 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.

No whole-change observations.

Comment thread neqo-http3/src/features/extended_connect/session.rs
Comment thread neqo-transport/src/datagram_queue.rs
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from 40e8b3a to 8a6e7f8 Compare September 30, 2026 03:21

@github-actions github-actions Bot 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.

I found nothing new. The only defect I found, peer-closed sessions leaving has_pending_datagram_counts() stuck at true, is already raised in an existing review thread.

@github-actions github-actions Bot 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.

I found nothing new to report. The one defect I found is already raised in an existing unresolved review thread: a session closed by the peer, left in FinPending, keeps has_pending_datagram_counts() true, so should_be_processed() returns true on every server tick.

@larseggert larseggert left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Is the PR description accurate? There are a lot of changes here that appear unrelated to counting expired datagrams.

@mxinden

mxinden commented Oct 1, 2026

Copy link
Copy Markdown
Member

This pull request now includes #3988, right? If so, can you reply to my comment #3988 (review) ?

This is still pending.

@jesup

jesup commented Oct 2, 2026

Copy link
Copy Markdown
Member Author

This pull request now includes #3988, right? If so, can you reply to my comment #3988 (review) ?

Yeah, it turns out some of this is no longer needed, post removal of IDs, etc. A server only exposes session stats through close_session's return value, and close_session already collects any pending expiries. The client sweeps on every process_output(). So the extra server wake-up just made stats read by tests fresher. I removed it here and from the later commits that relied on it.

Less code FTW :-)

@jesup

jesup commented Oct 2, 2026

Copy link
Copy Markdown
Member Author

lars

the PR had absorbed #3988; that part is gone and the description now lists what's left. I'll add the description from the patch here as well (annoying that the tool doesn't add/sync them)

@jesup

jesup commented Oct 2, 2026

Copy link
Copy Markdown
Member Author

I found nothing new. The only defect found, peer-closed sessions making should_be_processed() return true on every tick, is already raised in an existing review thread.

the wake-up is gone, and the leftover queue is now dropped on peer close

Implement Protocol::record_expired_outgoing_datagrams on the WebTransport
session, so SessionStats::datagrams_expired_outgoing counts datagrams shed
for exceeding outgoingMaxAge; the field existed but stayed zero.

The HTTP/3 layer picks the counts up in its per-session sweep, and
close_session collects any still pending before returning the final stats.
Add Connection::next_datagram_expiry so the sweep can skip scanning the
receive streams when nothing is due.

A session the peer closes drops its queue as soon as it leaves the active
state; a close capsule without a FIN would otherwise leave the queue in
place until the FIN arrives.  Datagrams still queued when a session closes
are dropped, not counted as expired.
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from 5dfb5fe to 1f13246 Compare October 2, 2026 21:48
@jesup
jesup changed the base branch from main to users/jesup/rename_max_buffered_datagrams October 2, 2026 21:49

@github-actions github-actions Bot 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.

I found nothing new to report.

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to users/jesup/rename_max_buffered_datagrams at fdf2b5a.

neqo-pr as clientneqo-pr as server
neqo-pr vs. go-x-net: BP BA
neqo-pr vs. haproxy: BP BA
neqo-pr vs. kwik: 🚀LR Z 🚀3 U L1 🚀L2 C1 ⚠️C2
neqo-pr vs. lsquic: L1 C1
neqo-pr vs. msquic: Z A L1 C1
neqo-pr vs. mvfst: A
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 ⚠️BA
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: CM
kwik vs. neqo-pr: BP BA CM
linuxquic vs. neqo-pr: CM
msquic vs. neqo-pr: CM
mvfst vs. neqo-pr: Z L1 C1 CM
neqo vs. neqo-pr: Z A
openssl vs. neqo-pr: LR M A CM
quic-go vs. neqo-pr: CM
quic-zig vs. neqo-pr: CM
quiche vs. neqo-pr: CM
quinn vs. neqo-pr: 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

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Client/server transfer results

Performance differences relative to fdf2b5a.

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 70.8 ± 0.4 69.8 – 71.7 70.7 ± 0.4 452.2 ± 2.5 💔 +0.7 (+1.0%)
neqo-google-cubic 226.0 ± 42.0 177.7 – 476.3 220.1 ± 26.5 141.6 ± 26.3 💚 -6.7 (-3.0%)

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 134.4 ± 0.5 133.1 – 135.6 134.4 ± 0.4 238.0 ± 0.9
google-neqo-cubic 70.8 ± 0.4 69.8 – 71.7 70.7 ± 0.4 452.2 ± 2.5 💔 +0.7 (+1.0%)
neqo-google-cubic 226.0 ± 42.0 177.7 – 476.3 220.1 ± 26.5 141.6 ± 26.3 💚 -6.7 (-3.0%)
neqo-neqo-cubic 19.7 ± 0.2 19.4 – 20.3 19.7 ± 0.1 1620.4 ± 12.8 +0.1 (+0.4%)
neqo-neqo-cubic-nopacing 19.5 ± 0.1 19.1 – 20.1 19.5 ± 0.1 1641.5 ± 12.1 -0.0 (-0.1%)
neqo-neqo-newreno 19.5 ± 0.2 19.2 – 19.9 19.5 ± 0.1 1639.0 ± 13.1 -0.1 (-0.6%)
neqo-neqo-newreno-nopacing 19.3 ± 0.2 18.9 – 20.0 19.3 ± 0.1 1659.6 ± 16.3 -0.1 (-0.3%)
neqo-quiche-cubic 32.7 ± 0.3 32.0 – 33.4 32.6 ± 0.3 979.9 ± 9.6 +0.1 (+0.3%)
neqo-s2n-cubic 38.6 ± 0.3 37.9 – 39.4 38.6 ± 0.2 828.4 ± 5.4 +0.0 (+0.0%)
quiche-neqo-cubic 38.8 ± 0.5 38.1 – 40.4 38.6 ± 0.3 824.7 ± 11.3 +0.2 (+0.4%)
quiche-quiche 38.7 ± 0.2 38.3 – 39.4 38.7 ± 0.3 826.5 ± 5.1
s2n-neqo-cubic 111.2 ± 0.4 110.3 – 112.2 111.2 ± 0.3 287.7 ± 0.9 +0.1 (+0.1%)
s2n-s2n ⚠️ 166.3 ± 27.7 134.3 – 258.1 159.3 ± 0.9 192.4 ± 32.1

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

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Benchmark results

No significant performance differences relative to fdf2b5a.

All results
transfer/1-conn/1-100mb-req (aka. Upload)/mtu-1500
       time:   [49.499 ms 49.548 ms 49.601 ms]
       thrpt:  [1.9688 GiB/s 1.9709 GiB/s 1.9729 GiB/s]
Found 6 outliers among 100 measurements (6.00%)
6 (6.00%) high mild
transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1500
       time:   [50.538 ms 50.608 ms 50.683 ms]
       thrpt:  [1.9268 GiB/s 1.9297 GiB/s 1.9323 GiB/s]
Found 8 outliers among 100 measurements (8.00%)
6 (6.00%) high mild
2 (2.00%) high severe
transfer/1-conn/1-1b-resp (aka. HPS)/mtu-1500
       time:   [2.9297 ms 2.9307 ms 2.9317 ms]
       thrpt:  [341.10   B/s 341.22   B/s 341.33   B/s]
Found 6 outliers among 100 measurements (6.00%)
6 (6.00%) high mild
transfer/1-conn/10_000-parallel-1b-resp (aka. RPS)/mtu-1500
       time:   [66.505 ms 66.763 ms 67.018 ms]
       thrpt:  [149.21 Kelem/s 149.78 Kelem/s 150.36 Kelem/s]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) low mild
streams-flow-controlled/walltime/1-streams/each-4194304-bytes
       time:   [10.387 ms 10.391 ms 10.394 ms]
       thrpt:  [384.83 MiB/s 384.96 MiB/s 385.09 MiB/s]
streams-flow-controlled/walltime/10-streams/each-1048576-bytes
       time:   [28.056 ms 28.064 ms 28.073 ms]
       thrpt:  [356.21 MiB/s 356.32 MiB/s 356.43 MiB/s]
streams/walltime/1-streams/each-1000-bytes
       time:   [129.65 µs 130.20 µs 130.90 µs]
       thrpt:  [7.2854 MiB/s 7.3246 MiB/s 7.3557 MiB/s]
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
streams/walltime/1000-streams/each-1-bytes
       time:   [3.8208 ms 3.8328 ms 3.8443 ms]
       thrpt:  [254.03 KiB/s 254.79 KiB/s 255.59 KiB/s]
streams/walltime/1000-streams/each-1000-bytes
       time:   [11.105 ms 11.112 ms 11.118 ms]
       thrpt:  [85.776 MiB/s 85.827 MiB/s 85.877 MiB/s]
transfer/walltime/pacing-false/same-seed
       time:   [2.0327 ms 2.0339 ms 2.0352 ms]
       thrpt:  [1.9194 GiB/s 1.9206 GiB/s 1.9217 GiB/s]
transfer/walltime/pacing-false/varying-seeds
       time:   [2.0438 ms 2.0448 ms 2.0460 ms]
       thrpt:  [1.9092 GiB/s 1.9103 GiB/s 1.9113 GiB/s]
transfer/walltime/pacing-true/same-seed
       time:   [2.0535 ms 2.0544 ms 2.0555 ms]
       thrpt:  [1.9004 GiB/s 1.9014 GiB/s 1.9023 GiB/s]
transfer/walltime/pacing-true/varying-seeds
       time:   [2.0599 ms 2.0609 ms 2.0621 ms]
       thrpt:  [1.8943 GiB/s 1.8954 GiB/s 1.8964 GiB/s]

Instructions per cycle

Criterion reported no significant timing changes.

All benchmarks
Benchmark IPC before IPC after ΔIPC
streams/walltime/1000-streams/each-1000-bytes 2.99 3.10 +3.6%
streams-flow-controlled/walltime/10-streams/each-1048576-bytes 3.15 3.20 +1.7%
transfer/1-conn/1-100mb-req (aka. Upload)/mtu-1500 3.20 3.18 -0.6%
streams/walltime/1-streams/each-1000-bytes 2.51 2.52 +0.6%
transfer/1-conn/10_000-parallel-1b-resp (aka. RPS)/mtu-1500 3.23 3.21 -0.5%
streams/walltime/1000-streams/each-1-bytes 3.26 3.27 +0.4%
transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1500 3.21 3.22 +0.3%
transfer/walltime/pacing-false/same-seed 2.87 2.88 +0.2%
transfer/walltime/pacing-true/same-seed 2.87 2.86 -0.2%
streams-flow-controlled/walltime/1-streams/each-4194304-bytes 3.02 3.02 +0.2%
transfer/walltime/pacing-false/varying-seeds 2.88 2.88 -0.1%
transfer/1-conn/1-1b-resp (aka. HPS)/mtu-1500 2.24 2.24 -0.1%
transfer/walltime/pacing-true/varying-seeds 2.88 2.89 +0.1%
Profiles for profiler.firefox.com (62)

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

This branch has not been deployed

No deployments
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.

4 participants