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

Scott Stanton commented on HTTPCORE-315:
----------------------------------------

I have attached a possible fix for this issue.  Splitting the 
RouteSpecificPool.completed() call into createEntry() and completed() allows 
the requestCompleted() method to add the entry to the global leased list before 
calling completed().
                
> HttpAsyncRequester leaks a connection if a request is cancelled before the 
> connection is established
> ----------------------------------------------------------------------------------------------------
>
>                 Key: HTTPCORE-315
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-315
>             Project: HttpComponents HttpCore
>          Issue Type: Bug
>          Components: HttpCore NIO
>    Affects Versions: 4.2.2
>            Reporter: Scott Stanton
>         Attachments: HTTPCORE-315.patch
>
>
> When using HttpAsyncRequester in combination with a BasicNIOConnPool, if the 
> future returned from execute() is cancelled before the connection is 
> established, then the connection will be leaked after it connects (added to 
> the leased list after the cancelled() callbacks are invoked).  The sequence 
> that leads to this is:
> * AbstractNIOConnPool.requestCompleted() calls RouteSpecificPool.completed() 
> which ultimately calls HttpAsyncRequester.completed()
> * HttpAsyncRequester.completed() detects that the requestFuture is done, so 
> it attempts to release the pool entry
> * The pool entry hasn't been added to the leased list yet, so the release has 
> no effect and the connection is not added to the available list
> * After the completed callback returns to requestCompleted(), the connection 
> is added to the leased list.
> At this point, no thread is expecting to do anything further with the 
> connection, so it is effectively lost and consuming a pool slot.
> I think the correct remedy is to ensure that the connection is added to the 
> global leased list as well as the route specific leased list before the 
> completed() callback is invoked.  This should ensure that the connection is 
> properly cleaned up.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to