> The HttpBodySubscriberWrapper is a class that ensures that a subscriber will 
> be subscribed to before it is completed. It also provides hooks to its two 
> subclasses (one for HTTP/1, one for HTTP/2) that allows subclasses to 
> register the susbscriber with the HttpClient at subscription time, and to 
> unregister it when it is eventualy completed, or when the subscription is 
> cancelled.
> 
> There is however a race condition that can happen when a subscription is 
> cancelled: it can happen that unregister is called before register. The 
> CancelRequestTest has been observed failing once or twice on personal jobs. 
> Though the particular mechanics of this race is hard to understand, the logs 
> of the tests have brought sufficient evidence that this is what was 
> happening. 
> 
> The symptom is finding one subscriber still registered after completion of 
> the exchange:
> 
> test 
> CancelRequestTest.testGetSendAsync("https://localhost:42711/https1/x/same/interrupt";,
>  true, true): failure
> java.lang.AssertionError: WARNING: tracker for HttpClientImpl(13) has 
> outstanding operations:
> Pending HTTP Requests: 0
> Pending HTTP/1.1 operations: 0
> Pending HTTP/2 streams: 0
> Pending WebSocket operations: 0
> Pending TCP connections: 0
> Pending Subscribers: 1
> Total pending operations: 0
> Facade referenced: true
> Selector alive: true
> 
> The proposed fix hoist special hooks for register/unregister in the 
> superclass, merges all various volatile boolean states into a single int 
> state, and protect the state changes  to subscribed/register/unregister by 
> the same subscription lock.
> If cancelling the subscription happens at around the same time that the 
> subscriber is subscribed this ensures that the subscriber won't be removed 
> from the map before it is added.

Daniel Fuchs has updated the pull request incrementally with one additional 
commit since the last revision:

  Fixed boolean cancelled() {}

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/12587/files
  - new: https://git.openjdk.org/jdk/pull/12587/files/f0fb66fb..d85b1e0b

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

  Stats: 1 line in 1 file changed: 0 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/12587.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/12587/head:pull/12587

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

Reply via email to