diag(quic-interop): dump first 10 packets fully + add live-driver-flow synth test

Two adds for the multiplex investigation.

(1) inspect-multiplexing.sh: previous histograms aggregate over the
   whole run. Add full-frame-array dump of the first 10 packet_sent
   AND first 10 packet_received events so we can see whether the
   FIRST chunk burst (~13 streams in one packet) or dribbled (1 per).

(2) MultiplexingAioquicTpsTest: synchronous drain test using EXACTLY
   the TPs aioquic gave us in the failing run (initial_max_data=1MB,
   initial_max_stream_data_bidi_remote=1MB, initial_max_streams_bidi=
   128) and ~80-byte HEADERS-frame-sized payloads. PASSES with 7
   packets / 9.1 streams per packet — proving the writer's coalescing
   is fine under aioquic's flow-control budget. So the bug is NOT in
   the writer; it's in the live driver flow that
   MultiplexingCoalescingTest doesn't exercise (concurrent send loop
   + parser + real socket).

The first-10 dump from inspect should localize this further:
  - if first packet has 13 stream frames → writer burst, bug is
    server-side timing or driver-loop scheduling
  - if first packet has 1 stream frame → writer producing 1 per call
    in production for some condition my synchronous test doesn't
    cover

https://claude.ai/code/session_01HcvfQq1ttPV9PkRoJb4nyT
This commit is contained in:
Claude
2026-05-07 12:56:44 +00:00
parent 9d1d053407
commit 4616234c82
2 changed files with 164 additions and 1 deletions
+13 -1
View File
@@ -76,7 +76,19 @@ if [[ -n "$QLOG" ]]; then
| sort -n | uniq -c
echo
echo "=============== peer transport_parameters (initial_max_data is the key) ==============="
echo "=============== first 10 packet_sent events (full) ==============="
# The very first stream-bearing packets reveal whether we burst
# the chunk's 64 streams OR dribbled them out one per RTT. Look
# at the `frames` array — if it has 13 stream entries, writer
# is bursting; if 1, writer is regressed.
grep '"name":"transport:packet_sent"' "$QLOG" | head -n 10
echo
echo "=============== first 10 packet_received events (full) ==============="
# If we sent N streams in burst, server should respond with N
# responses interleaved as it processes them. Spread tells us
# server-side serial cost.
grep '"name":"transport:packet_received"' "$QLOG" | head -n 10
# If initial_max_data is small (e.g. < 1000 bytes), our writer
# gets throttled to one stream per packet because connBudget
# exhausts after the first stream. Each subsequent stream has to