[ 
https://issues.apache.org/jira/browse/HTTPCORE-795?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18063755#comment-18063755
 ] 

Oleg Kalnichevski commented on HTTPCORE-795:
--------------------------------------------

[~benjaminp] The defect causing a leak in case of a connection leak request 
timeout has been fixed in core by [~abernal] with 
[https://github.com/apache/httpcomponents-core/pull/649] 

I also investigated the issue with thread interruption and found out that 
connections could indeed get leaked when the *_release_* operation gets 
interrupted. This is exactly what i have suspected. As an analogy it is like 
hitting a computer with a sledge hammer to turn it off and then wondering why 
the heck it fails to start up again.

Please adjust you code and re-test in with the latest HttpCore snapshot.

Oleg

 

> interrupts and timeouts may leak connections
> --------------------------------------------
>
>                 Key: HTTPCORE-795
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-795
>             Project: HttpComponents HttpCore
>          Issue Type: Bug
>            Reporter: Benjamin Peterson
>            Priority: Minor
>             Fix For: 5.4.3, 5.5-alpha1
>
>         Attachments: HttpGetExample.java, HttpGetExample2.java, 
> TimeoutLeakExample.java
>
>          Time Spent: 1h 20m
>  Remaining Estimate: 0h
>
> 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 if heavy load 
> means the blocked thread is delayed in being scheduled to propagate the 
> {{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