GitHub user hirthwork opened a pull request:

    https://github.com/apache/httpcore/pull/21

    Fix race condition in 
org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput and 
org.apache.http.impl.nio.client.AbstractClientExchangeHandler.connectionAllocated(conn)

    Got pretty bad race condition when sending async requests.
    Symptoms & Environment: We have target host which sometimes closes 
connections after requests processing but no `Connection: close` header was 
set. Some requests hangs, i.e. `BasicFuture` methods `.cancelled`, `.completed` 
or `.failed` methods are never called.
    
    Analysis:
    Let there be two threads:
    - T1 is the async client reactor thread.
    - T2 is the thread that initiates HTTP request.
    
    T1: completes HTTP request and calls `connmgr.releaseConnection`
    T2: initiates HTTP requests asks connmgr for connection and immediately 
gets connection that was just released by T1
    T1: receives EOF on released connection and falls into 
`HttpAsyncRequestExecutor.endOfInput`. Connection has valid 
`HTTP_EXCHANGE_STATE`, but `HTTP_HANDLER` is null
    T2: sets `HTTP_HANDLER`, requests output and checks `.isState`. Everything 
is OK here.
    T1: goes to the end of `.endOfInput` and closes connection. `HTTP_HANDLER` 
is not null anymore, but is won't be notified about connection close, soon 
connection will be garbage collected and it will never be released and 
`HTTP_HANDLER.basicFuture` will never be notified.
    
    Suggested fix (not sure if it is optimal, but it changed behaviour to be 
more redundant):
    At the start of `.endOfInput` try to notify `HTTP_HANDLER`. If there is no 
one, set variable `handlerNotified` to false.
    After connection close check `handlerNotified` and if it wasn't, then check 
if somebody has set `HTTP_HANDLER` externally.

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/hirthwork/httpcore 4.4.x

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/httpcore/pull/21.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #21
    
----
commit aa680cafe67e92dfe7bdb96e03c67bb9f1905b87
Author: Dmitry Potapov <dpota...@yandex-team.ru>
Date:   2016-02-05T18:44:15Z

    HttpAsyncRequestExecutor.getState(conn) and 
HttpAsyncRequestExecutor.getHandler(conn) made static

commit 363df092bfbabe8b32e2223615af0671f9846bcb
Author: Dmitry Potapov <dpota...@yandex-team.ru>
Date:   2016-02-05T18:47:28Z

    Double check for HttpAsyncClientExchangeHandler presence in 
HttpAsyncRequestExecutor.endOfInput

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

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

Reply via email to