Benjamin Peterson created HTTPCLIENT-2416:
---------------------------------------------

             Summary: interrupts and timeouts may leak connections
                 Key: HTTPCLIENT-2416
                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2416
             Project: HttpComponents HttpClient
          Issue Type: Bug
    Affects Versions: 5.6
            Reporter: Benjamin Peterson


Consider {InternalExecRuntime.acquireEndpoint}}:
{code:java}
            try {
                final ConnectionEndpoint connectionEndpoint = 
connRequest.get(connectionRequestTimeout);
            } catch (final TimeoutException ex) {
                connRequest.cancel();
                throw new ConnectionRequestTimeoutException(ex.getMessage());
            } catch (final InterruptedException interrupted) {
                connRequest.cancel();
                Thread.currentThread().interrupt();
                throw new RequestFailedException("Request aborted", 
interrupted);
            }
{code}
Consider this order of operations:
1. The thread blocked in {{codeRequest.get}} is interrupted or times out.
2. The connection pool completes the future with a connection.
3. The interrupted thread starts propagating the {{InterruptedException}} or 
{{TimeoutException}}. When it reaches the {{catch}} blocks, it will call 
{{connRequest.cancel()}}. But cancelation will do nothing because the 
connection pool already completed the future. The connection will leak.

The window may be narrow, but it's certainly a possibility with heavy load 
means the blocked thread is delayed in being scheduled to propagate 
{{InterruptedException}} or {{TimeoutException}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to