Anurag Agarwal created HTTPASYNC-155:
----------------------------------------

             Summary: I/O Reactor Shutdown issues due to race condition in 
AbstractClientExchangeHandler
                 Key: HTTPASYNC-155
                 URL: https://issues.apache.org/jira/browse/HTTPASYNC-155
             Project: HttpComponents HttpAsyncClient
          Issue Type: Bug
            Reporter: Anurag Agarwal


{code:java}
HTTP GET http://localhost:8080/AdExchange/healthcheck: 500  Output: Health 
check failed because I/O reactor status STOPPED
Time: Fri Nov 15 15:52:38 UTC 2019
org.apache.http.impl.conn.ConnectionShutdownException
        at 
org.apache.http.impl.nio.conn.CPoolProxy.getValidConnection(CPoolProxy.java:74)
        at 
org.apache.http.impl.nio.conn.CPoolProxy.getContext(CPoolProxy.java:219)
        at 
org.apache.http.impl.nio.client.AbstractClientExchangeHandler.connectionAllocated(AbstractClientExchangeHandler.java:328)
        at 
org.apache.http.impl.nio.client.AbstractClientExchangeHandler.access$000(AbstractClientExchangeHandler.java:62)
        at 
org.apache.http.impl.nio.client.AbstractClientExchangeHandler$1.completed(AbstractClientExchangeHandler.java:387)
        at 
org.apache.http.impl.nio.client.AbstractClientExchangeHandler$1.completed(AbstractClientExchangeHandler.java:383)
        at 
org.apache.http.concurrent.BasicFuture.completed(BasicFuture.java:122)
        at 
org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager$1.completed(PoolingNHttpClientConnectionManager.java:306)
        at 
org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager$1.completed(PoolingNHttpClientConnectionManager.java:297)
        at 
org.apache.http.concurrent.BasicFuture.completed(BasicFuture.java:122)
        at 
org.apache.http.nio.pool.RouteSpecificPool.completed(RouteSpecificPool.java:146)
        at 
org.apache.http.nio.pool.AbstractNIOConnPool.requestCompleted(AbstractNIOConnPool.java:563)
        at 
org.apache.http.nio.pool.AbstractNIOConnPool$InternalSessionRequestCallback.completed(AbstractNIOConnPool.java:883)
        at 
org.apache.http.impl.nio.reactor.SessionRequestImpl.completed(SessionRequestImpl.java:154)
        at 
org.apache.http.impl.nio.reactor.AbstractIOReactor.processNewChannels(AbstractIOReactor.java:426)
        at 
org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:287)
        at 
org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
        at 
org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
        at java.lang.Thread.run(Thread.java:748)
{code}

I am currently not able to identify the excat source of this issue. But 
somewhere I am getting a hint that before execution of line 
AbstractClientExchnageHandler:328 
{noformat}
final HttpContext context = managedConn.getContext();
{noformat}

Cancel is called which discards the connection and detach the pool entry from 
the proxy. It was difficult to come up with the exact source since there are 
many places from where dicard connection and release connection is being 
called. But since only after adding the cancel workflow such errors are coming 
up, I tried to take that road and it seems possible that the race condition can 
indeed happen.

We can notice in that method just few lines above this line we are checking if 
the handler is closed or not but even that line may have passed after which the 
connection was actually closed. It was just closed before the execution of this 
line as the line just above this line still has entry or else 
NullPointerException would have come.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

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

Reply via email to