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]
