Commit 0441d08
committed
Let an idle CID update past a stale ping-pong guard
Misc.IdleDestCidChange failed both kernel BVTs, and a bisect settled where
it came from: 1cee9be, the per-path MTU probe, fails 2 of 4 kernel jobs
while its parent 2674a37 passes 4 of 4. Three other control refs pass 12
of 12 between them. It never reproduces on Linux.
What the ETL trace shows. RetirePriorTo is not a decision, it is
arithmetic -- Sequence + 1 - SourceCidLimit, with the limit at 4 -- so
once either side advertises a source CID at sequence 4 or above the peer
is forced to replace its destination CIDs. That runs
QuicPathIDReplaceRetiredCids, which raises Path->InitiatedCidUpdate and,
unlike QuicPathIDRetireCurrentDestCid, does not count the update. The flag
is cleared in exactly one place, on a peer CID change, which need never
come. The connection then goes quiet, and the idle update in QuicSendFlush
is refused by !Path->InitiatedCidUpdate for the rest of the connection's
life.
The flag stops a change of ours and the peer's answer to it from
ping-ponging, so it is wanted while an answer might still arrive. Nothing
has been sent or received for the whole idle interval by the time this
check runs, so anything pending is long over and the flag is stale. It is
cleared here rather than consulted. Behaviour during an active exchange is
unchanged.
Not the earlier theory. I first blamed Send->LastFlushTime being stamped
by a probe that gave up, and fixed that in 0419a77. That fix is right on
its own terms -- a probe that sends nothing should not reset the idle
clock -- but it was not this, and it did not help.
Local: IdleDestCidChange 20/20, targeted 40/40, 172 in the path sweep and
1443 in the broad sweep, clang-tidy 21 clean. Since this does not
reproduce on Linux, the real check is the kernel BVT, twice -- one 4/4 run
leaves about a 6% chance of missing a 50% failure.1 parent 0419a77 commit 0441d08
1 file changed
Lines changed: 19 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1966 | 1966 | | |
1967 | 1967 | | |
1968 | 1968 | | |
1969 | | - | |
1970 | | - | |
| 1969 | + | |
| 1970 | + | |
| 1971 | + | |
| 1972 | + | |
| 1973 | + | |
| 1974 | + | |
| 1975 | + | |
| 1976 | + | |
| 1977 | + | |
| 1978 | + | |
| 1979 | + | |
| 1980 | + | |
| 1981 | + | |
| 1982 | + | |
| 1983 | + | |
| 1984 | + | |
| 1985 | + | |
| 1986 | + | |
| 1987 | + | |
1971 | 1988 | | |
1972 | 1989 | | |
1973 | 1990 | | |
| |||
0 commit comments