On Fri, 19 Feb 2021 16:20:01 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.
>
> Daniel Fuchs has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Remove commented code in test

test/jdk/java/net/httpclient/ProxyServer.java line 390:

> 388:                             clientSocket.shutdownInput();
> 389:                             close();
> 390:                             return;

I realise it isn't related to this change, but why is the test proxy closing 
the connection?

test/jdk/java/net/httpclient/ProxyServer.java line 60:

> 58:         return IS_WINDOWS;
> 59:     }
> 60: 

Could add some blank lines above.

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

PR: https://git.openjdk.java.net/jdk/pull/2649

Reply via email to