Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Support QNS connectionmigration test #2180

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

larseggert
Copy link
Collaborator

No description provided.

Copy link

codecov bot commented Oct 15, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 95.39%. Comparing base (944c817) to head (fb3e4f2).
Report is 4 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #2180   +/-   ##
=======================================
  Coverage   95.39%   95.39%           
=======================================
  Files         112      112           
  Lines       36373    36373           
=======================================
  Hits        34697    34697           
  Misses       1676     1676           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link

Failed Interop Tests

QUIC Interop Runner, client vs. server

neqo-latest as client

neqo-latest as server

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

Copy link

Benchmark results

Performance differences relative to 9b5ec71.

coalesce_acked_from_zero 1+1 entries: Change within noise threshold.
       time:   [98.667 ns 98.975 ns 99.285 ns]
       change: [-1.1530% -0.6526% -0.1307%] (p = 0.01 < 0.05)

Found 11 outliers among 100 measurements (11.00%)
8 (8.00%) high mild
3 (3.00%) high severe

coalesce_acked_from_zero 3+1 entries: Change within noise threshold.
       time:   [116.55 ns 116.92 ns 117.37 ns]
       change: [-1.6300% -1.1367% -0.6766%] (p = 0.00 < 0.05)

Found 13 outliers among 100 measurements (13.00%)
1 (1.00%) low mild
12 (12.00%) high severe

coalesce_acked_from_zero 10+1 entries: Change within noise threshold.
       time:   [116.20 ns 116.69 ns 117.26 ns]
       change: [-1.0334% -0.5508% -0.0494%] (p = 0.03 < 0.05)

Found 13 outliers among 100 measurements (13.00%)
3 (3.00%) low severe
1 (1.00%) low mild
2 (2.00%) high mild
7 (7.00%) high severe

coalesce_acked_from_zero 1000+1 entries: Change within noise threshold.
       time:   [97.222 ns 97.354 ns 97.497 ns]
       change: [-2.3957% -1.3394% -0.3219%] (p = 0.01 < 0.05)

Found 9 outliers among 100 measurements (9.00%)
2 (2.00%) high mild
7 (7.00%) high severe

RxStreamOrderer::inbound_frame(): Change within noise threshold.
       time:   [111.39 ms 111.43 ms 111.47 ms]
       change: [-0.4888% -0.4225% -0.3545%] (p = 0.00 < 0.05)

Found 8 outliers among 100 measurements (8.00%)
4 (4.00%) low mild
4 (4.00%) high mild

transfer/pacing-false/varying-seeds: No change in performance detected.
       time:   [25.874 ms 26.972 ms 28.071 ms]
       change: [-6.5127% -1.3162% +4.4105%] (p = 0.64 > 0.05)
transfer/pacing-true/varying-seeds: Change within noise threshold.
       time:   [32.755 ms 34.434 ms 36.118 ms]
       change: [-13.050% -7.4690% -1.2882%] (p = 0.02 < 0.05)
transfer/pacing-false/same-seed: No change in performance detected.
       time:   [24.894 ms 25.643 ms 26.387 ms]
       change: [-4.3845% -0.4154% +3.6399%] (p = 0.85 > 0.05)

Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) low mild

transfer/pacing-true/same-seed: No change in performance detected.
       time:   [39.974 ms 41.897 ms 43.877 ms]
       change: [-6.8805% -0.7726% +5.4228%] (p = 0.81 > 0.05)

Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild

1-conn/1-100mb-resp (aka. Download)/client: No change in performance detected.
       time:   [114.09 ms 114.53 ms 114.92 ms]
       thrpt:  [870.17 MiB/s 873.16 MiB/s 876.46 MiB/s]
change:
       time:   [-16.607% -5.8393% +0.8998%] (p = 0.59 > 0.05)
       thrpt:  [-0.8918% +6.2014% +19.914%]

Found 5 outliers among 100 measurements (5.00%)
1 (1.00%) low severe
4 (4.00%) low mild

1-conn/10_000-parallel-1b-resp (aka. RPS)/client: Change within noise threshold.
       time:   [316.07 ms 319.71 ms 323.31 ms]
       thrpt:  [30.931 Kelem/s 31.278 Kelem/s 31.638 Kelem/s]
change:
       time:   [+0.7672% +2.3644% +3.9885%] (p = 0.00 < 0.05)
       thrpt:  [-3.8355% -2.3098% -0.7614%]

Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) low mild
2 (2.00%) high mild

1-conn/1-1b-resp (aka. HPS)/client: No change in performance detected.
       time:   [34.050 ms 34.277 ms 34.537 ms]
       thrpt:  [28.954  elem/s 29.174  elem/s 29.369  elem/s]
change:
       time:   [-0.3590% +0.6545% +1.6837%] (p = 0.21 > 0.05)
       thrpt:  [-1.6558% -0.6503% +0.3603%]

Found 7 outliers among 100 measurements (7.00%)
2 (2.00%) high mild
5 (5.00%) high severe

Client/server transfer results

Transfer of 33554432 bytes over loopback.

Client Server CC Pacing Mean [ms] Min [ms] Max [ms] Relative
msquic msquic 155.6 ± 68.8 90.6 325.3 1.00
neqo msquic reno on 227.2 ± 10.0 214.8 241.9 1.00
neqo msquic reno 286.8 ± 73.2 215.4 411.3 1.00
neqo msquic cubic on 217.4 ± 12.3 203.4 236.7 1.00
neqo msquic cubic 222.6 ± 15.8 205.2 260.4 1.00
msquic neqo reno on 176.6 ± 128.3 89.7 563.7 1.00
msquic neqo reno 154.9 ± 88.0 91.7 359.8 1.00
msquic neqo cubic on 139.0 ± 79.8 82.3 324.9 1.00
msquic neqo cubic 131.8 ± 84.3 81.5 344.7 1.00
neqo neqo reno on 215.5 ± 118.3 130.0 500.1 1.00
neqo neqo reno 230.5 ± 126.7 140.7 565.8 1.00
neqo neqo cubic on 207.7 ± 96.5 129.1 436.4 1.00
neqo neqo cubic 197.0 ± 71.3 114.0 430.4 1.00

⬇️ Download logs

@@ -493,6 +493,14 @@ fn qlog_new(args: &Args, hostname: &str, cid: &ConnectionId) -> Res<NeqoQlog> {
.map_err(Error::QlogError)
}

const fn unspecified_addr(addr: &SocketAddr) -> SocketAddr {
Copy link
Member

Choose a reason for hiding this comment

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

It seems like you could include the port number in the signature.

I'm also unsure about the name. This might be local_addr_for(remote_addr, local_port). The usage below can use local_port: 0.

neqo-bin/src/client/mod.rs Show resolved Hide resolved
@@ -554,6 +557,18 @@ pub async fn client(mut args: Args) -> Res<()> {
remote_addr,
);

let migration = if args.shared.qns_test == Some("connectionmigration".to_owned()) {
Copy link
Member

Choose a reason for hiding this comment

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

Why is this not possible?

Suggested change
let migration = if args.shared.qns_test == Some("connectionmigration".to_owned()) {
let migration = if args.shared.qns_test == Some("connectionmigration") {

I know that qns_test is a String, but you should be able to PartialEq it with &'static str perfectly well.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

error[E0308]: mismatched types
   --> neqo-bin/src/client/mod.rs:560:57
    |
560 |         let migration = if args.shared.qns_test == Some("connectionmigration") {
    |                                                    ---- ^^^^^^^^^^^^^^^^^^^^^- help: try using a conversion method: `.to_string()`
    |                                                    |    |
    |                                                    |    expected `String`, found `&str`
    |                                                    arguments to this enum variant are incorrect
    |
help: the type constructed contains `&'static str` due to the type of the argument passed
   --> neqo-bin/src/client/mod.rs:560:52
    |
560 |         let migration = if args.shared.qns_test == Some("connectionmigration") {
    |                                                    ^^^^^---------------------^
    |                                                         |
    |                                                         this argument influences the type of `Some`
note: tuple variant defined here
   --> /Users/lars/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/option.rs:579:5
    |
579 |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
    |     ^^^^

Comment on lines +112 to +113
// Don't do another migration.
self.migration = None;
Copy link
Member

Choose a reason for hiding this comment

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

So you are only doing this change if the migration works. What errors are you trying to ignore? Would this be easier if the migration attempt only occurred for State::Confirmed?

I was going to suggest that you do self.migration.take() above instead, before I realized that migration could be attempted multiple times.

}
}

#[allow(clippy::too_many_lines)]
Copy link
Member

Choose a reason for hiding this comment

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

This is usually a good sign that some work is needed. Offhand, I see a nice candidate on line 517 (to 532).

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.

3 participants