diff --git a/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/HqInteropGetClient.kt b/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/HqInteropGetClient.kt index 74e143adc..027bf73bc 100644 --- a/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/HqInteropGetClient.kt +++ b/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/HqInteropGetClient.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.flow.toList */ class HqInteropGetClient( private val conn: QuicConnection, - @Suppress("UNUSED_PARAMETER") private val driver: QuicConnectionDriver, + private val driver: QuicConnectionDriver, ) : GetClient { override suspend fun prepareRequest( @Suppress("UNUSED_PARAMETER") authority: String, @@ -49,6 +49,8 @@ class HqInteropGetClient( val request = "GET $path\r\n".encodeToByteArray() stream.send.enqueue(request) stream.send.finish() + // Wake the send loop — same reasoning as Http3GetClient. + driver.wakeup() return HqRequestHandle(stream) } diff --git a/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/Http3GetClient.kt b/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/Http3GetClient.kt index a3dc638b8..c1a20bed5 100644 --- a/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/Http3GetClient.kt +++ b/quic/interop/src/main/kotlin/com/vitorpamplona/quic/interop/runner/Http3GetClient.kt @@ -151,6 +151,13 @@ class Http3GetClient( val stream = conn.openBidiStream() stream.send.enqueue(encodeRequest(authority, path)) stream.send.finish() + // Without this, the data sits in the queue until the PTO + // timer fires (~1 s later). On the longrtt scenario (750 ms + // one-way, 1.5 s RTT) that's a fatal delay — the runner's + // 8 s timeout doesn't leave room for the PTO + RTT + RTT + // dance. The parallel path wakes after the chunk; the + // serial path was missing the same nudge. + driver.wakeup() return Http3RequestHandle(stream) }