> 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.shutdownInput() and socket.close() in the test proxy - > when running on windows.
Daniel Fuchs has updated the pull request incrementally with one additional commit since the last revision: Remove commented code in test ------------- Changes: - all: https://git.openjdk.java.net/jdk/pull/2649/files - new: https://git.openjdk.java.net/jdk/pull/2649/files/a88a7928..1ff87ebc Webrevs: - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=2649&range=01 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=2649&range=00-01 Stats: 8 lines in 1 file changed: 0 ins; 7 del; 1 mod Patch: https://git.openjdk.java.net/jdk/pull/2649.diff Fetch: git fetch https://git.openjdk.java.net/jdk pull/2649/head:pull/2649 PR: https://git.openjdk.java.net/jdk/pull/2649