rschmitt opened a new pull request, #597:
URL: https://github.com/apache/httpcomponents-core/pull/597

   I discovered a race condition while investigating a sporadic test failure in 
the client:
   
   ```
   [ERROR]   
HttpMinimalIntegrationTests$H2Tls>AbstractHttpAsyncFundamentalsTest.testSequentialGetRequests:86
 ยป Execution org.apache.hc.core5.http2.H2StreamResetException: Cancelled
   ```
   
   It turned out that two threads are somehow racing when calling 
`ComplexCancellable.setDependency()`:
   
   ```
   setDependency 
dep=org.apache.hc.client5.http.impl.async.MinimalH2AsyncClient$$Lambda$655/251536271@633478cb
 ct=ForkJoinPool-1-worker-2
   setDependency dep=[id=1, reserved=false, removeClosed=false, 
localClosed=false, localReset=false] ct=httpclient-dispatch-1
   setDependency 
dep=org.apache.hc.client5.http.impl.async.MinimalH2AsyncClient$$Lambda$655/251536271@2e66671a
 ct=ForkJoinPool-1-worker-2
   setDependency dep=[id=3, reserved=false, removeClosed=false, 
localClosed=false, localReset=false] ct=httpclient-dispatch-1
   setDependency 
dep=org.apache.hc.client5.http.impl.async.MinimalH2AsyncClient$$Lambda$655/251536271@32f4e96
 ct=ForkJoinPool-1-worker-2
   setDependency dep=[id=5, reserved=false, removeClosed=false, 
localClosed=false, localReset=false] ct=httpclient-dispatch-1
   ```
   
   The implementation of `setDependency` was performing a single CAS and 
interpreting failure to mean that the mark bit had been set -- in other words, 
that another thread had called `cancel()`, rather than `setDependency()`.
   
   This change corrects the implementation of `setDependency` by having it run 
the CAS in a loop. On each update failure, it checks if the mark bit has been 
set (nothing ever unsets it). If so, it calls `dependency.cancel()` and 
returns; else, it just tries again.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to