On Fri, 19 Feb 2021 16:08:25 GMT, Daniel Fuchs <dfu...@openjdk.org> wrote:
> Hi, > > Please find here a fix for: > 8262027: Improve how HttpConnection detects a closed channel when > taking/returning a connection to the pool > > While writing a new test to verify that it was possible to handle proxy *and* > server authentication manually when both proxy and server required > authentication, I stumbled on a race condition where the next request after > receiving 407 would manage to retrieve the connection from the pool just > before the connection close was receive from the proxy. Since the test was > using POST, and POST are not retried by default, this caused the test to fail > randomly and intermittently. > > This fix proposes to add a checkOpen() method to HttpConnection, which we can > call just after retrieving a connection from the pool. This method will > attempt to read 1 byte from the channel. Because the connection was in the > pool, it should not have received anything, and because the channel is > non-blocking, the `read` should always return 0, unless the channel has been > closed. This forces an early check on the channel state, rather then waiting > for the selector to wake up the Selector Manager Thread - which might happen > too late. > > This is not a 100% silver bullet, but it drastically reduced the number of > failures I was observing (to 0 after several 100 loops of testing on all > machines). The only other failures I observed was on windows, where > apparently closing the socket on the server side can cause a reset, even when > SO_LINGER and TCP_NODELAY are specified. I solved that by adding a small > delay between socket.shutdownOutput() and socket.close() in the test proxy - > when running on windows. This pull request has now been integrated. Changeset: 0d2dbd29 Author: Daniel Fuchs <dfu...@openjdk.org> URL: https://git.openjdk.java.net/jdk/commit/0d2dbd29 Stats: 607 lines in 4 files changed: 566 ins; 6 del; 35 mod 8262027: Improve how HttpConnection detects a closed channel when taking/returning a connection to the pool Reviewed-by: chegar, michaelm ------------- PR: https://git.openjdk.java.net/jdk/pull/2649