On Thu, 16 Feb 2023 09:51:27 GMT, Daniel Fuchs <[email protected]> wrote:

> 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.

This pull request has now been integrated.

Changeset: edf238b6
Author:    Daniel Fuchs <[email protected]>
URL:       
https://git.openjdk.org/jdk/commit/edf238b65e441a1d626f3a4ba06170badd05ca7c
Stats:     235 lines in 4 files changed: 190 ins; 22 del; 23 mod

8302635: Race condition in HttpBodySubscriberWrapper when cancelling request

Reviewed-by: jpai

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

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

Reply via email to