Http3 test server thread deadlock in ThrowingPublishersInRequest

XMLWordPrintable

    • 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)

            Assignee:
            Daniel Jelinski
            Reporter:
            Daniel Jelinski
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: