Files
amethyst/quic
Claude bd9d717dff fix(quic-interop): QlogWriter swallows post-close writes
aioquic full-matrix run came back 0/7 with stack traces:
  java.io.IOException: Stream closed
    at QlogWriter.writeLineLocked(QlogWriter.kt:289)
    at QlogWriter.onPacketSent(QlogWriter.kt:126)
    at QuicConnectionWriter.emitQlogSent(...)

The send loop runs concurrently with InteropClient's teardown sequence:
  1. driver.close() — launches CLOSING → CLOSED async
  2. qlogWriter?.close() — closes the file
  3. delay(50)
  4. scope.cancel() — kills coroutines

Between (2) and (4), the send loop is still alive and emits
packet_sent for the CONNECTION_CLOSE Initial. QlogWriter.writeLineLocked
threw IOException into the send loop, propagated up, took down the
connection — including connections that had completed transfer
successfully.

Fix: QlogWriter swallows post-close IOExceptions silently. An observer
must NOT break the connection it's observing — that's the whole NoOp
contract. Adds @Volatile closed flag, latches it both on explicit
close() and on the first IOException; subsequent emits short-circuit.

picoquic was 5/7 (predictable: M + S still open) so the regression was
specifically aioquic-timing-sensitive. With this fix aioquic should
return to 5/7 too.

https://claude.ai/code/session_01HcvfQq1ttPV9PkRoJb4nyT
2026-05-07 00:40:21 +00:00
..