Luca Cavanna created HTTPCORE-591:
-------------------------------------

             Summary: "Connection must be created by connection manager" raised 
when requests are reused after being abortedf
                 Key: HTTPCORE-591
                 URL: https://issues.apache.org/jira/browse/HTTPCORE-591
             Project: HttpComponents HttpCore
          Issue Type: Bug
    Affects Versions: 4.4.11
            Reporter: Luca Cavanna


We are using http async client in the official Java REST client for 
Elasticsearch. We recently introduced the ability to cancel requests. While 
testing such new feature, I encountered a test failure that can be reproduced 
when the same request instance is reused (although reset is called after each 
run) after being cancelled. The following exception is raised, which calls the 
reactor to shut down unexpectedly, which fails all subsequent requests:


{noformat}
Aug 15, 2019 2:04:52 PM org.apache.http.impl.nio.client.InternalHttpAsyncClient 
run
SEVERE: I/O reactor terminated abnormally
org.apache.http.nio.reactor.IOReactorException: I/O dispatch worker terminated 
abnormally
        at 
org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:359)
        at 
org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:221)
        at 
org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64)
        at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.IllegalStateException: Connection must be created by 
connection manager
        at 
org.apache.http.impl.nio.client.InternalIODispatch.createConnection(InternalIODispatch.java:56)
        at 
org.apache.http.impl.nio.client.InternalIODispatch.createConnection(InternalIODispatch.java:39)
        at 
org.apache.http.impl.nio.reactor.AbstractIODispatch.connected(AbstractIODispatch.java:70)
        at 
org.apache.http.impl.nio.reactor.BaseIOReactor.sessionCreated(BaseIOReactor.java:248)
        at 
org.apache.http.impl.nio.reactor.AbstractIOReactor.processNewChannels(AbstractIOReactor.java:427)
        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)
        ... 1 more

Exception in thread "main" java.util.concurrent.ExecutionException: 
java.lang.IllegalStateException: I/O reactor has been shut down
        at org.apache.http.concurrent.BasicFuture.getResult(BasicFuture.java:71)
        at org.apache.http.concurrent.BasicFuture.get(BasicFuture.java:84)
        at 
org.apache.http.impl.nio.client.FutureWrapper.get(FutureWrapper.java:70)
        at ClientTest.main(ClientTest.java:31)
Caused by: java.lang.IllegalStateException: I/O reactor has been shut down
        at org.apache.http.util.Asserts.check(Asserts.java:34)
        at 
org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.connect(DefaultConnectingIOReactor.java:228)
        at 
org.apache.http.nio.pool.AbstractNIOConnPool.processPendingRequest(AbstractNIOConnPool.java:481)
        at 
org.apache.http.nio.pool.AbstractNIOConnPool.lease(AbstractNIOConnPool.java:280)
        at 
org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.requestConnection(PoolingNHttpClientConnectionManager.java:295)
        at 
org.apache.http.impl.nio.client.AbstractClientExchangeHandler.requestConnection(AbstractClientExchangeHandler.java:377)
        at 
org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.start(DefaultClientExchangeHandlerImpl.java:129)
        at 
org.apache.http.impl.nio.client.InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:141)
        at 
org.apache.http.impl.nio.client.CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:75)
        at 
org.apache.http.impl.nio.client.CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:85)
        at ClientTest.main(ClientTest.java:28)
{noformat}




The following snippet reproduces it most of the times:

{code:java}
import com.sun.net.httpserver.HttpServer;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.concurrent.CancellationException;
import java.util.concurrent.Future;

public class ClientTest {

    public static void main(String[] args) throws Exception {
        HttpServer httpServer = HttpServer.create(new 
InetSocketAddress(InetAddress.getLoopbackAddress(), 0), 0);
        httpServer.start();
        httpServer.createContext("/test", exchange -> {
            exchange.sendResponseHeaders(200, 0);
            exchange.close();
        });
        HttpHost httpHost = new 
HttpHost(httpServer.getAddress().getHostString(), 
httpServer.getAddress().getPort());
        try (CloseableHttpAsyncClient client = 
HttpAsyncClientBuilder.create().build()) {
            client.start();
            HttpGet httpGet = new HttpGet("/test");
            for (int i = 0; i < 10000; i++) {
                httpGet.reset();
                Future<HttpResponse> future = client.execute(httpHost, httpGet, 
null);
                httpGet.abort();
                try {
                    future.get();
                    assert false;
                } catch(CancellationException e) {
                    //expected
                }
            }
        } finally {
            httpServer.stop(0);
        }
    }
}

{code}





--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

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

Reply via email to