From 7ac70498ac189b45a4af91134a98f8decbd7c00a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 8 May 2026 14:30:32 -0400 Subject: [PATCH] =?UTF-8?q?fix(quic-interop):=20bump=20HANDSHAKE=5FTIMEOUT?= =?UTF-8?q?=5FSEC=2010s=20=E2=86=92=2030s=20for=20amplificationlimit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The amplificationlimit testcase scenario drops client→server packets 2–7. Recovering past 6 consecutive drops via RFC 9000 PTO doublings (0.3+0.6+1.2+2.4+4.8+9.6 ≈ 19s) is more than the previous 10s budget allowed — we declared handshake_failed mid-recovery. Bumping to 30s matches the multiconnect handshake budget and gives clean PTO headroom. Fixes: amplificationlimit ✕→✓ vs picoquic. No regression vs quinn (was already passing at ~14s). Normal handshakes complete in <1s so the bump is invisible outside lossy paths. Still fails: amplificationlimit vs quic-go and msquic. Their server-side handshake-progress watchdog gives up at ~10s of silence regardless of our budget. The proper fix is RFC 9002 §6.2.4 — send 2 ack-eliciting packets per PTO probe instead of 1, halving the recovery time for consecutive drops. That's a writer-side change, deferred. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../quic/interop/runner/InteropClient.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/InteropClient.kt b/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/InteropClient.kt index 0ef119cd7a..a8a1ac3a7a 100644 --- a/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/InteropClient.kt +++ b/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/InteropClient.kt @@ -62,7 +62,16 @@ private const val UNSET_LABEL = "(unset)" // IANA ALPN identifier for HTTP/0.9-over-QUIC used by quic-interop-runner. private const val ALPN_HQ_INTEROP = "hq-interop" -private const val HANDSHAKE_TIMEOUT_SEC = 10L +// Bumped 10 → 30 to survive the `amplificationlimit` testcase. The +// runner drops client→server packets 2–7 (six in a row), so we have +// to PTO our way past six exponentially-spaced retransmits before +// the eighth packet finally gets through (≈19s of doublings: +// 0.3+0.6+1.2+2.4+4.8+9.6). At the old 10s budget we declared +// handshake_failed mid-recovery and the test failed against +// quic-go/picoquic/msquic. 30s matches the multiconnect budget for +// the same RFC 9002 PTO reasoning. Normal-case handshakes still +// complete in well under a second; this only affects the floor. +private const val HANDSHAKE_TIMEOUT_SEC = 30L // Multiconnect's per-iteration handshake timeout. The runner's // handshakeloss / handshakecorruption tests run 50 sequential