RFR: 8372198: Avoid closing PlainHttpConnection while holding a lock [v2]

Daniel Fuchs dfuchs at openjdk.org
Mon Nov 24 14:25:12 UTC 2025


> An experimental change to SelectorManager::shutdown unveiled a potential deadlock between the SelectorManager thread trying to stop the HttpClientImpl, and an executor thread concurrently trying to return a connection to the pool.
> 
> The issue seems to be caused by the ConnectionPool::returnToPool trying to close the returned connection when stopping, while holding the ConnectionPool state lock, and the SelectorManager thread trying to close a pooled connection, holding the connection stateLock and trying to close the channel, which caused the CleanupTrigger to fire and attempt to remove the connection from the pool.
> 
> This problem was observed once with the java/net/httpclient/ThrowingSubscribersAsLimitingAsync.java test.
> 
> To avoid the problem, the proposed fix is to wait until the ConnectionPool::stateLock has been released before actually closing the connection, and to wait until the PlainHttpConnection::stateLock has been released before actually closing the channel. Indeed, there should be no need to close those while holding the lock.
> 
> This PR was recreated due to a bad merge pushed to https://github.com/openjdk/jdk/pull/28421

Daniel Fuchs has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains six additional commits since the last revision:

 - 8372198: Avoid closing PlainHttpConnection while holding a lock
 - Merge branch 'master' into SelectorManagerVT-8372159
 - Copyright years
 - Review feedback on test
 - Revert changes to SelectorManager::shutdown
 - 8372159: HttpClient SelectorManager thread could be a VirtualThread

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/28430/files
  - new: https://git.openjdk.org/jdk/pull/28430/files/a8b1fb8d..a8b1fb8d

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=28430&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=28430&range=00-01

  Stats: 0 lines in 0 files changed: 0 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/28430.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/28430/head:pull/28430

PR: https://git.openjdk.org/jdk/pull/28430


More information about the net-dev mailing list