When [JDK-8277969](https://bugs.openjdk.org/browse/JDK-8277969) was implemented 
a list of outstanding response subscribers was added to HttpClientImpl. A body 
subscriber is added to the list after being created and is removed from the 
list when it is completed, either successfully or exceptionally.

It appears that in the case where the subscription is cancelled before the 
subscriber is completed, the subscriber might remain registered in the list 
forever, or at least until the HttpClient gets garbage collected. This can be 
easily reproduced using streaming subscribers, such as 
BodySubscriber::ofInputStream. In the case where the input stream is closed 
without having read all the bytes, Subscription::cancel will be called. Whether 
the subscriber gets unregistered or not at that point becomes racy.

Indeed, the reactive stream specification doesn't guarantee whether onComplete 
or onError will be called or not after a subscriber cancels its subscription. 
Any cleanup that would have been performed by onComplete/onError might 
therefore need to be performed when the subscription is cancelled too.

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

Commit messages:
 - Merge branch 'master' into inputstream-leak-8294916
 - 8294916

Changes: https://git.openjdk.org/jdk/pull/10659/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=10659&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8294916
  Stats: 552 lines in 8 files changed: 536 ins; 1 del; 15 mod
  Patch: https://git.openjdk.org/jdk/pull/10659.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/10659/head:pull/10659

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

Reply via email to