Open djc opened 11 months ago
The assertion in question:
assert_eq!(pair.client_conn_mut(client_ch).lost_packets(), 0);
If it doesn't reproduce consistently then it's probably due to the randomized packet number skipping. I don't think packet loss should be a consequence, so there may be an issue here, but I'll need to investigate closely to be sure.
Initial notes from the logs: failed case has the server skipping pn 4, which shouldn't matter, as the key update happens on client packet 11. The server fails to decrypt packet 11, then oddly detects a key update on both packets 10 and 12... and then continues communication, even though that's too many updates.
Failed:
2023-10-23T09:45:35.3000745Z 2023-10-23T09:45:34.955758Z INFO quinn_proto::tests: updated keys
2023-10-23T09:45:35.3002788Z 2023-10-23T09:45:34.955768Z TRACE quinn_proto::connection::streams: wrote 3 bytes stream=client bidirectional stream 0
2023-10-23T09:45:35.3005884Z 2023-10-23T09:45:34.955824Z TRACE send{space=Data pn=11}: quinn_proto::connection::streams::state: STREAM id=client bidirectional stream 0 off=1 len=3 fin=false
2023-10-23T09:45:35.3008624Z 2023-10-23T09:45:34.955871Z TRACE quinn_proto::connection: sending 33 bytes in 1 datagrams
2023-10-23T09:45:35.3010741Z 2023-10-23T09:45:34.955933Z TRACE server: quinn_proto::connection: got Data packet (33 bytes) from [::1]:44476 using id c40ae82aa9b490fc
2023-10-23T09:45:35.3013307Z 2023-10-23T09:45:34.955958Z TRACE server: quinn_proto::connection::packet_crypto: decryption failed with packet number 11
2023-10-23T09:45:35.3015643Z 2023-10-23T09:45:34.955975Z DEBUG server: quinn_proto::connection: failed to authenticate packet
2023-10-23T09:45:35.3017609Z 2023-10-23T09:45:34.955989Z TRACE server: quinn_proto::connection: got Data packet (30 bytes) from [::1]:44476 using id c40ae82aa9b490fc
2023-10-23T09:45:35.3025235Z 2023-10-23T09:45:34.956007Z TRACE server: quinn_proto::connection: key update authenticated
2023-10-23T09:45:35.3027431Z 2023-10-23T09:45:34.956016Z TRACE server: quinn_proto::connection: executing key update
2023-10-23T09:45:35.3030566Z 2023-10-23T09:45:34.956087Z TRACE server:recv{space=Data pn=10}: quinn_proto::connection: got stream frame id=client bidirectional stream 0 offset=0 len=1 fin=false
2023-10-23T09:45:35.3033455Z 2023-10-23T09:45:34.956147Z TRACE quinn_proto::tests::util: advancing to 25ms for server
2023-10-23T09:45:35.3035280Z 2023-10-23T09:45:34.956181Z TRACE server: quinn_proto::connection: timeout timer=MaxAckDelay
2023-10-23T09:45:35.3037118Z 2023-10-23T09:45:34.956195Z TRACE server: quinn_proto::connection: max ack delay reached
2023-10-23T09:45:35.3039243Z 2023-10-23T09:45:34.956225Z TRACE server:send{space=Data pn=10}: quinn_proto::connection: ACK ArrayRangeSet([9..11]), Delay = 25000us
2023-10-23T09:45:35.3041515Z 2023-10-23T09:45:34.956267Z TRACE server: quinn_proto::connection: sending 35 bytes in 1 datagrams
2023-10-23T09:45:35.3043478Z 2023-10-23T09:45:34.956322Z TRACE client: quinn_proto::connection: got Data packet (35 bytes) from [::1]:4476 using id e11fa3bd3e60e510
2023-10-23T09:45:35.3047021Z 2023-10-23T09:45:34.956375Z TRACE client:recv{space=Data pn=10}: quinn_proto::connection: got frame Ack(Ack { largest: 10, delay: 3125, ecn: Some(EcnCounts { ect0: 11, ect1: 0, ce: 0 }), ranges: "[9..=10]" })
2023-10-23T09:45:35.3049634Z 2023-10-23T09:45:34.956578Z TRACE quinn_proto::tests::util: advancing to 26ms for client
2023-10-23T09:45:35.3051202Z 2023-10-23T09:45:34.956595Z TRACE client: quinn_proto::connection: timeout timer=LossDetection
2023-10-23T09:45:35.3053372Z 2023-10-23T09:45:34.956633Z TRACE client: quinn_proto::connection: PTO fired in_flight=33 count=0 space=Data
2023-10-23T09:45:35.3055579Z 2023-10-23T09:45:34.956689Z TRACE client:send{space=Data pn=12}: quinn_proto::connection: PING
2023-10-23T09:45:35.3058073Z 2023-10-23T09:45:34.956705Z TRACE client:send{space=Data pn=12}: quinn_proto::connection: IMMEDIATE_ACK
2023-10-23T09:45:35.3060576Z 2023-10-23T09:45:34.956720Z TRACE client:send{space=Data pn=12}: quinn_proto::connection::packet_builder: PADDING * 1
2023-10-23T09:45:35.3062528Z 2023-10-23T09:45:34.956758Z TRACE client: quinn_proto::connection: sending 30 bytes in 1 datagrams
2023-10-23T09:45:35.3064439Z 2023-10-23T09:45:34.956797Z TRACE client:send{space=Data pn=13}: quinn_proto::connection: PING
2023-10-23T09:45:35.3067202Z 2023-10-23T09:45:34.956811Z TRACE client:send{space=Data pn=13}: quinn_proto::connection: IMMEDIATE_ACK
2023-10-23T09:45:35.3070207Z 2023-10-23T09:45:34.956826Z TRACE client:send{space=Data pn=13}: quinn_proto::connection::packet_builder: PADDING * 1
2023-10-23T09:45:35.3073315Z 2023-10-23T09:45:34.956861Z TRACE client: quinn_proto::connection: sending 30 bytes in 1 datagrams
2023-10-23T09:45:35.3076524Z 2023-10-23T09:45:34.956934Z TRACE server: quinn_proto::connection: got Data packet (30 bytes) from [::1]:44476 using id c40ae82aa9b490fc
2023-10-23T09:45:35.3078853Z 2023-10-23T09:45:34.956959Z TRACE server: quinn_proto::connection: key update authenticated
2023-10-23T09:45:35.3081332Z 2023-10-23T09:45:34.956968Z TRACE server: quinn_proto::connection: executing key update
2023-10-23T09:45:35.3083863Z 2023-10-23T09:45:34.957039Z TRACE server:recv{space=Data pn=12}: quinn_proto::connection: got frame Ping
2023-10-23T09:45:35.3086605Z 2023-10-23T09:45:34.957075Z TRACE server:recv{space=Data pn=12}: quinn_proto::connection: got frame ImmediateAck
2023-10-23T09:45:35.3089389Z 2023-10-23T09:45:34.957110Z TRACE server: quinn_proto::connection: got Data packet (30 bytes) from [::1]:44476 using id c40ae82aa9b490fc
2023-10-23T09:45:35.3091638Z 2023-10-23T09:45:34.957157Z TRACE server:recv{space=Data pn=13}: quinn_proto::connection: got frame Ping
2023-10-23T09:45:35.3094082Z 2023-10-23T09:45:34.957190Z TRACE server:recv{space=Data pn=13}: quinn_proto::connection: got frame ImmediateAck
2023-10-23T09:45:35.3096677Z 2023-10-23T09:45:34.957244Z TRACE server:send{space=Data pn=11}: quinn_proto::connection: ACK ArrayRangeSet([9..11, 12..14]), Delay = 0us
2023-10-23T09:45:35.3099121Z 2023-10-23T09:45:34.957287Z TRACE server: quinn_proto::connection: sending 36 bytes in 1 datagrams
2023-10-23T09:45:35.3101439Z 2023-10-23T09:45:34.957387Z TRACE client: quinn_proto::connection: got Data packet (36 bytes) from [::1]:4476 using id e11fa3bd3e60e510
2023-10-23T09:45:35.3104579Z 2023-10-23T09:45:34.957444Z TRACE client:recv{space=Data pn=11}: quinn_proto::connection: got frame Ack(Ack { largest: 13, delay: 0, ecn: Some(EcnCounts { ect0: 13, ect1: 0, ce: 0 }), ranges: "[12..=13,9..=10]" })
2023-10-23T09:45:35.3108301Z 2023-10-23T09:45:34.957483Z TRACE client:recv{space=Data pn=11}:frame{ty=ACK}: quinn_proto::connection: packets lost: [11], bytes lost: 33
2023-10-23T09:45:35.3113232Z 2023-10-23T09:45:34.957571Z TRACE client:send{space=Data pn=14}: quinn_proto::connection::streams::state: STREAM id=client bidirectional stream 0 off=1 len=3 fin=false
2023-10-23T09:45:35.3116228Z 2023-10-23T09:45:34.957657Z TRACE client: quinn_proto::connection: sending 33 bytes in 1 datagrams
2023-10-23T09:45:35.3119129Z 2023-10-23T09:45:34.957715Z TRACE server: quinn_proto::connection: got Data packet (33 bytes) from [::1]:44476 using id c40ae82aa9b490fc
2023-10-23T09:45:35.3123826Z 2023-10-23T09:45:34.957772Z TRACE server:recv{space=Data pn=14}: quinn_proto::connection: got stream frame id=client bidirectional stream 0 offset=1 len=3 fin=false
2023-10-23T09:45:35.3127122Z 2023-10-23T09:45:34.957857Z TRACE quinn_proto::tests::util: advancing to 51ms for server
2023-10-23T09:45:35.3128803Z 2023-10-23T09:45:34.957970Z TRACE server: quinn_proto::connection: timeout timer=MaxAckDelay
2023-10-23T09:45:35.3130920Z 2023-10-23T09:45:34.957989Z TRACE server: quinn_proto::connection: max ack delay reached
2023-10-23T09:45:35.3133211Z 2023-10-23T09:45:34.958024Z TRACE server:send{space=Data pn=12}: quinn_proto::connection: ACK ArrayRangeSet([9..11, 12..15]), Delay = 25000us
2023-10-23T09:45:35.3135633Z 2023-10-23T09:45:34.958072Z TRACE server: quinn_proto::connection: sending 37 bytes in 1 datagrams
2023-10-23T09:45:35.3137959Z 2023-10-23T09:45:34.958133Z TRACE client: quinn_proto::connection: got Data packet (37 bytes) from [::1]:4476 using id e11fa3bd3e60e510
2023-10-23T09:45:35.3141250Z 2023-10-23T09:45:34.958192Z TRACE client:recv{space=Data pn=12}: quinn_proto::connection: got frame Ack(Ack { largest: 14, delay: 3125, ecn: Some(EcnCounts { ect0: 14, ect1: 0, ce: 0 }), ranges: "[12..=14,9..=10]" })
2023-10-23T09:45:35.3144039Z 2023-10-23T09:45:34.958310Z TRACE quinn_proto::tests::util: advancing to 104ms for client
2023-10-23T09:45:35.3146086Z 2023-10-23T09:45:34.958327Z TRACE client: quinn_proto::connection: timeout timer=KeyDiscard
2023-10-23T09:45:35.3148240Z 2023-10-23T09:45:34.958360Z TRACE server: quinn_proto::connection: timeout timer=KeyDiscard
Succeeded:
2023-10-23T16:49:34.207550Z INFO quinn_proto::tests: updated keys
2023-10-23T16:49:34.207575Z TRACE quinn_proto::connection::streams: wrote 3 bytes stream=client bidirectional stream 0
2023-10-23T16:49:34.207612Z TRACE send{space=Data pn=11}: quinn_proto::connection::streams::state: STREAM id=client bidirectional stream 0 off=1 len=3 fin=false
2023-10-23T16:49:34.207647Z TRACE quinn_proto::connection: sending 33 bytes in 1 datagrams
2023-10-23T16:49:34.207692Z TRACE server: quinn_proto::connection: got Data packet (33 bytes) from [::1]:44433 using id 5c31a1c145faa434
2023-10-23T16:49:34.207714Z TRACE server: quinn_proto::connection: key update authenticated
2023-10-23T16:49:34.207723Z TRACE server: quinn_proto::connection: executing key update
2023-10-23T16:49:34.207775Z TRACE server:recv{space=Data pn=11}: quinn_proto::connection: got stream frame id=client bidirectional stream 0 offset=1 len=3 fin=false
2023-10-23T16:49:34.207812Z TRACE server: quinn_proto::connection: got Data packet (30 bytes) from [::1]:44433 using id 5c31a1c145faa434
2023-10-23T16:49:34.207850Z TRACE server:recv{space=Data pn=10}: quinn_proto::connection: got stream frame id=client bidirectional stream 0 offset=0 len=1 fin=false
2023-10-23T16:49:34.207898Z TRACE server:send{space=Data pn=9}: quinn_proto::connection: ACK ArrayRangeSet([9..12]), Delay = 0us
2023-10-23T16:49:34.207930Z TRACE server: quinn_proto::connection: sending 34 bytes in 1 datagrams
2023-10-23T16:49:34.207971Z TRACE client: quinn_proto::connection: got Data packet (34 bytes) from [::1]:4433 using id 55f87d9f909a3ae2
2023-10-23T16:49:34.208010Z TRACE client:recv{space=Data pn=9}: quinn_proto::connection: got frame Ack(Ack { largest: 11, delay: 0, ecn: Some(EcnCounts { ect0: 12, ect1: 0, ce: 0 }), ranges: "[9..=11]" })
2023-10-23T16:49:34.208082Z TRACE quinn_proto::tests::util: advancing to 78ms for client
2023-10-23T16:49:34.208097Z TRACE client: quinn_proto::connection: timeout timer=KeyDiscard
2023-10-23T16:49:34.208125Z TRACE server: quinn_proto::connection: timeout timer=KeyDiscard
Saw this again on stable in FreeBSD at https://github.com/quinn-rs/quinn/actions/runs/7535071853/job/20510448889. This time there doesn't seem to have been any PN skipping at all, so I guess that was a red herring.
Another failure on Ubuntu beta: https://github.com/quinn-rs/quinn/actions/runs/7535119285/job/20510576738?pr=1740
Again: https://github.com/quinn-rs/quinn/actions/runs/10185475414/job/28175129233
This looks... weird?
https://github.com/quinn-rs/quinn/actions/runs/6611503872/job/17955509790