Scott Stanton created HTTPCORE-315:
--------------------------------------
Summary: 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
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: [email protected]
For additional commands, e-mail: [email protected]