fix(quic-interop): detect multiplexing by URL count, not TESTCASE name

The smoking gun from the 2026-05-07 multiplex run boot log:

  [boot] DEBUG=1; ...; TESTCASE=transfer; ROLE=client
  [boot] transfer mode: parallel=false urls=1999

quic-interop-runner sets TESTCASE_CLIENT=transfer for ALL the
transfer-family testcases (transfer, multiplexing, transferloss,
transfercorruption). Discrimination between transfer (1 file) and
multiplexing (~2000 files) happens by URL count, NOT by TESTCASE
name — so our check `parallel = (testcase == "multiplexing")` was
always false, even for the multiplexing test, and we always took
the serial fallback path: client.get(authority, path) per URL,
opening one stream + awaiting before the next. That's why the wire
showed exactly one stream per RTT for the entire 60s.

Fix: parallel = (token count of REQUESTS env var) > 1. Effectively:
  - 1 URL → transfer testcase, serial path
  - >1 URL → multiplexing testcase, batched-parallel path

Verified the writer's batched coalescing already works in unit
tests (MultiplexingCoalescingTest, MultiplexingAioquicTpsTest both
green at ~9 streams/packet). With this dispatch fix, the live
runner should finally reach the batched code path.

Bumped WRITER_DEBUG_BUILD_ID so the next [boot] line confirms
the fix is deployed.
This commit is contained in:
Claude
2026-05-07 14:24:52 +00:00
parent a9dc927cc6
commit ac0d6f06a9
2 changed files with 16 additions and 2 deletions
@@ -198,7 +198,21 @@ fun main() {
initialVersion = initialVersion,
keyLogPath = keyLogPath,
qlogDir = qlogDir,
parallel = (testcase == "multiplexing"),
// The runner reuses TESTCASE_CLIENT=transfer for the
// multiplexing testcase — discrimination is by URL
// count, not testcase name. We were checking
// testcase == "multiplexing" which is NEVER true
// (we'd see TESTCASE=multiplexing only on a
// hypothetical client where the runner explicitly
// sets it). Symptom: 60s timeout with 1421/2000
// files at 1 stream / RTT — exactly the serial
// client.get(...) path. Confirmed via the boot log:
// [boot] TESTCASE=transfer; transfer mode:
// parallel=false urls=1999
//
// Cheap whitespace tokenization here just counts;
// runTransferTest re-parses into URI[] inside.
parallel = requests.split(Regex("\\s+")).count { it.isNotBlank() } > 1,
)
}