RFR: 8376479: Http3 test server thread deadlock in ThrowingPublishersInRequest [v3]

Daniel Fuchs dfuchs at openjdk.org
Thu Jan 29 18:22:58 UTC 2026


On Thu, 29 Jan 2026 17:46:49 GMT, Volkan Yazici <vyazici at openjdk.org> wrote:

>> Daniel Jeliński has updated the pull request incrementally with two additional commits since the last revision:
>> 
>>  - Send stop_sending if the InputStream is closed
>>  - Close the stream atomically
>
> test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/http3/Http3ServerStreamImpl.java line 368:
> 
>> 366:         @Override
>> 367:         public void close() throws IOException {
>> 368:             if (closeReason.getAndSet(Boolean.TRUE) == Boolean.TRUE) return;
> 
> Shouldn't this be `!compareAndSet(null, TRUE)`? Otherwise we allow changing the state from `FAILED` to `CLOSED`, which, AFAICT, is not intended.

If it fails, and then you call close(), then it should be closed, regardless on whether it failed before?

> test/jdk/java/net/httpclient/lib/jdk/httpclient/test/lib/http3/Http3ServerStreamImpl.java line 371:
> 
>> 369:             if (debug.on())
>> 370:                 debug.log("Closing request body input stream");
>> 371:             requestBodyQueue.add(QuicStreamReader.EOF);
> 
> Do we need `requestBodyQueue.add(QuicStreamReader.EOF)` here and in `resetStream`, given `read()` will propagate the non-null `closeReason` thrown by `current()` anyway, and `current()` is the only reader of `requestBodyQueue`?

Yes. The read() call might be blocked taking from the queue (when the queue is empty) at the time of reset/close - which can happen asynchronously. This is the only way to wakeup the reader so that read() gets unblocked and throws.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/29448#discussion_r2742933385
PR Review Comment: https://git.openjdk.org/jdk/pull/29448#discussion_r2742940995


More information about the net-dev mailing list