-
Type:
Bug
-
Resolution: Unresolved
-
Priority:
P4
-
None
-
Affects Version/s: 27
-
Component/s: core-libs
The test passes normally; the deadlock is only visible when a thread dump is taken at the end of the test. Other tests might be affected too.
When the client aborts a HTTP3 request in the middle of sending the request body, and the server is actively reading the request, the thread that processes the incoming reset frame may deadlock with the thread that reads from the request body input stream. Stack traces:
"TestServer(3)-pool3" daemon prio=5 Id=78 WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@2d3afdc
at java.base@27-internal/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@2d3afdc
at java.base@27-internal/java.util.concurrent.locks.LockSupport.park(LockSupport.java:369)
at java.base@27-internal/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:520)
at java.base@27-internal/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:4346)
at java.base@27-internal/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:4292)
at java.base@27-internal/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1752)
at java.base@27-internal/java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$RequestBodyInputStream.current(Http3ServerStreamImpl.java:315)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$RequestBodyInputStream.read(Http3ServerStreamImpl.java:346)
at java.base@27-internal/java.io.InputStream.readNBytes(InputStream.java:411)
at java.base@27-internal/java.io.InputStream.readAllBytes(InputStream.java:348)
at app//AbstractThrowingPublishers$HTTP_FixedLengthHandler.handle(AbstractThrowingPublishers.java:868)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpChain$Http2Chain.doFilter(HttpServerAdapters.java:911)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpTestServer$Http2TestContext.handle(HttpServerAdapters.java:1602)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpTestHandler.doHandle(HttpServerAdapters.java:694)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpTestHandler.lambda$toHttp2Handler$0(HttpServerAdapters.java:681)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpTestHandler$$Lambda/0x0000000088157d90.handle(Unknown Source)
at app//jdk.httpclient.test.lib.http3.Http3TestServer.lambda$submitExchange$0(Http3TestServer.java:262)
at app//jdk.httpclient.test.lib.http3.Http3TestServer$$Lambda/0x00000000882e8000.run(Unknown Source)
at java.base@27-internal/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base@27-internal/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base@27-internal/java.lang.Thread.runWith(Thread.java:1529)
at java.base@27-internal/java.lang.Thread.run(Thread.java:1516)
"TestServer(3)-pool1" daemon prio=5 Id=57 WAITING on java.util.concurrent.locks.ReentrantLock$NonfairSync@66570d54 owned by "TestServer(3)-pool3" Id=78
at java.base@27-internal/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.ReentrantLock$NonfairSync@66570d54
at java.base@27-internal/java.util.concurrent.locks.LockSupport.park(LockSupport.java:223)
at java.base@27-internal/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:790)
at java.base@27-internal/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1030)
at java.base@27-internal/java.util.concurrent.locks.ReentrantLock$Sync.lock(ReentrantLock.java:154)
at java.base@27-internal/java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:323)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$RequestBodyInputStream.close(Http3ServerStreamImpl.java:377)
at app//jdk.httpclient.test.lib.http3.Http3ServerExchange.close(Http3ServerExchange.java:178)
at app//jdk.httpclient.test.lib.http3.Http3ServerExchange.streamResetByPeer(Http3ServerExchange.java:187)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl.lambda$resetReceived$1(Http3ServerStreamImpl.java:279)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$$Lambda/0x00000000882e8230.apply(Unknown Source)
at java.base@27-internal/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:705)
at java.base@27-internal/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:683)
at java.base@27-internal/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2227)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl.resetReceived(Http3ServerStreamImpl.java:279)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl.readLoop0(Http3ServerStreamImpl.java:220)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl.readLoop(Http3ServerStreamImpl.java:105)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$$Lambda/0x00000000882c66a0.run(Unknown Source)
at platform/java.net.http@27-internal/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:182)
at platform/java.net.http@27-internal/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
at platform/java.net.http@27-internal/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207)
at java.base@27-internal/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base@27-internal/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base@27-internal/java.lang.Thread.runWith(Thread.java:1529)
at java.base@27-internal/java.lang.Thread.run(Thread.java:1516)
When the client aborts a HTTP3 request in the middle of sending the request body, and the server is actively reading the request, the thread that processes the incoming reset frame may deadlock with the thread that reads from the request body input stream. Stack traces:
"TestServer(3)-pool3" daemon prio=5 Id=78 WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@2d3afdc
at java.base@27-internal/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@2d3afdc
at java.base@27-internal/java.util.concurrent.locks.LockSupport.park(LockSupport.java:369)
at java.base@27-internal/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:520)
at java.base@27-internal/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:4346)
at java.base@27-internal/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:4292)
at java.base@27-internal/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1752)
at java.base@27-internal/java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:435)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$RequestBodyInputStream.current(Http3ServerStreamImpl.java:315)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$RequestBodyInputStream.read(Http3ServerStreamImpl.java:346)
at java.base@27-internal/java.io.InputStream.readNBytes(InputStream.java:411)
at java.base@27-internal/java.io.InputStream.readAllBytes(InputStream.java:348)
at app//AbstractThrowingPublishers$HTTP_FixedLengthHandler.handle(AbstractThrowingPublishers.java:868)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpChain$Http2Chain.doFilter(HttpServerAdapters.java:911)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpTestServer$Http2TestContext.handle(HttpServerAdapters.java:1602)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpTestHandler.doHandle(HttpServerAdapters.java:694)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpTestHandler.lambda$toHttp2Handler$0(HttpServerAdapters.java:681)
at app//jdk.httpclient.test.lib.common.HttpServerAdapters$HttpTestHandler$$Lambda/0x0000000088157d90.handle(Unknown Source)
at app//jdk.httpclient.test.lib.http3.Http3TestServer.lambda$submitExchange$0(Http3TestServer.java:262)
at app//jdk.httpclient.test.lib.http3.Http3TestServer$$Lambda/0x00000000882e8000.run(Unknown Source)
at java.base@27-internal/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base@27-internal/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base@27-internal/java.lang.Thread.runWith(Thread.java:1529)
at java.base@27-internal/java.lang.Thread.run(Thread.java:1516)
"TestServer(3)-pool1" daemon prio=5 Id=57 WAITING on java.util.concurrent.locks.ReentrantLock$NonfairSync@66570d54 owned by "TestServer(3)-pool3" Id=78
at java.base@27-internal/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.ReentrantLock$NonfairSync@66570d54
at java.base@27-internal/java.util.concurrent.locks.LockSupport.park(LockSupport.java:223)
at java.base@27-internal/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:790)
at java.base@27-internal/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1030)
at java.base@27-internal/java.util.concurrent.locks.ReentrantLock$Sync.lock(ReentrantLock.java:154)
at java.base@27-internal/java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:323)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$RequestBodyInputStream.close(Http3ServerStreamImpl.java:377)
at app//jdk.httpclient.test.lib.http3.Http3ServerExchange.close(Http3ServerExchange.java:178)
at app//jdk.httpclient.test.lib.http3.Http3ServerExchange.streamResetByPeer(Http3ServerExchange.java:187)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl.lambda$resetReceived$1(Http3ServerStreamImpl.java:279)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$$Lambda/0x00000000882e8230.apply(Unknown Source)
at java.base@27-internal/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:705)
at java.base@27-internal/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:683)
at java.base@27-internal/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2227)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl.resetReceived(Http3ServerStreamImpl.java:279)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl.readLoop0(Http3ServerStreamImpl.java:220)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl.readLoop(Http3ServerStreamImpl.java:105)
at app//jdk.httpclient.test.lib.http3.Http3ServerStreamImpl$$Lambda/0x00000000882c66a0.run(Unknown Source)
at platform/java.net.http@27-internal/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:182)
at platform/java.net.http@27-internal/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
at platform/java.net.http@27-internal/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207)
at java.base@27-internal/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base@27-internal/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base@27-internal/java.lang.Thread.runWith(Thread.java:1529)
at java.base@27-internal/java.lang.Thread.run(Thread.java:1516)
- links to
-
Review(master)
openjdk/jdk/29448