7299fe80
docs: name which run each reproduction rate came from
a73x 2026-08-08 18:40
Commit message
docs/decisions.md
| Old | New | ||
|---|---|---|---|
| @@ -1111,13 +1111,21 @@ fit is that each explained half the evidence: | |||
| 1111 | - **The transient was `drainPending`.** It gives up the first time a wakeup | 1111 | - **The transient was `drainPending`.** It gives up the first time a wakeup |
| 1112 | retires nothing, which misreads a coalesced or flow-control-only | 1112 | retires nothing, which misreads a coalesced or flow-control-only |
| 1113 | acknowledgement as a finished peer. Reproduced on HEAD under four-way | 1113 | acknowledgement as a finished peer. Reproduced on HEAD under four-way |
| 1114 | contention on one core at **25 failures in 40 runs**, always the same | 1114 | contention pinned to one core, three times independently, always the same |
| 1115 | test, and driven to **0 in 40** by the fix. Observed, not inferred. | 1115 | test: **21 failures in 200 runs** (the investigation's batch), **25 in 40** |
| 1116 | (the implementer's, at smaller N), and **3 in 8** as the review's control. | ||
| 1117 | Driven to zero by the fix in every one — 0/200, 0/40, 0/12 respectively. | ||
| 1118 | Observed, not inferred. | ||
| 1116 | - **The leaks were the ngtcp2 abort** — but reaching the test suite through | 1119 | - **The leaks were the ngtcp2 abort** — but reaching the test suite through |
| 1117 | *other concurrent processes sharing `/tmp`*, not through the run that | 1120 | *other concurrent processes sharing `/tmp`*, not through the run that |
| 1118 | showed the failure. That is why the two never correlated: the 21 HEAD | 1121 | showed the failure. That is why the two never correlated: the |
| 1119 | failures produced zero leaks, because an assertion failure runs its | 1122 | investigation's 21 failures produced zero leaks, because an assertion |
| 1120 | defers and only a signal kills a process before they can run. | 1123 | failure runs its defers and only a signal kills a process before they can. |
| 1124 | |||
| 1125 | Three reproductions at three sample sizes, by three parties who did not | ||
| 1126 | share a harness, is the reason this section can say "observed" without | ||
| 1127 | qualification — and naming which batch each number came from is what keeps | ||
| 1128 | the two 2x-apart rates from looking like one number transcribed wrong. | ||
| 1121 | 1129 | ||
| 1122 | So the leaked temp directory was a true clue pointing at a real defect, and | 1130 | So the leaked temp directory was a true clue pointing at a real defect, and |
| 1123 | the failure it was found next to had a different cause entirely. Neither | 1131 | the failure it was found next to had a different cause entirely. Neither |
| @@ -1178,8 +1186,9 @@ reset by any progress) rather than acting on one, and by bounding the poll | |||
| 1178 | slice with ngtcp2's own next deadline, floored at 1ms. | 1186 | slice with ngtcp2's own next deadline, floored at 1ms. |
| 1179 | 1187 | ||
| 1180 | **Both halves were handed over as required; measurement says otherwise, and | 1188 | **Both halves were handed over as required; measurement says otherwise, and |
| 1181 | the measurement is what goes in the record.** Four-way contention on one | 1189 | the measurement is what goes in the record.** This is the implementer's |
| 1182 | core, 40 runs each: | 1190 | 40-run batch (the same one quoted above as 25/40), four-way contention on |
| 1191 | one core, run per configuration so the halves could be separated: | ||
| 1183 | 1192 | ||
| 1184 | | | failures | | 1193 | | | failures | |
| 1185 | |---|---| | 1194 | |---|---| |