The `ResponseSubscribers.HttpResponseInputStream` class has an assert that has 
been observed firing (rarely) when running the 
`java/net/httpclient/AsyncExecutorShutdown.java` test.

After a thorough analysis of the code and the log failure I am convinced that 
the issue is due to a misplaced assert.
If cancellation happens asynchronously while the subscriber is being subscribed 
with the lower layers of the stack, the `HttpResponseInputStream` might get 
closed and the `LAST_LIST` buffer might be offered after `closed == false` has 
been observed by the `onSubscribed` method, but before the assertion has been 
checked. The assertion assumes that the queue must be empty, but it might not 
if `close` has been called and the `LAST_LIST` buffer has been offered.

Moving the assert from within the synchronized block, to ensure that the 
observed value of `closed` is consistent with the state of the queue, should 
fix it. I have tagged the bug as `noreg-hard`, I'm not sure it would be fair to 
say that `AsyncExecutorShutdown.java` can be used to verify the fix.

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

Commit messages:
 - 8297424

Changes: https://git.openjdk.org/jdk/pull/11332/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=11332&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8297424
  Stats: 9 lines in 2 files changed: 3 ins; 2 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/11332.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/11332/head:pull/11332

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

Reply via email to