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

Gaojie Liu commented on HTTPCLIENT-2222:
----------------------------------------

Hi [~olegk] 

Let me share the analysis I did in our env.

Here is the stacktrace I dumped when the underlying session was closed while 
using 5.1.2.:
{code:java}
java.lang.Exception: Stack trace
        at java.base/java.lang.Thread.dumpStack(Thread.java:1388)
        at 
org.apache.hc.core5.reactor.InternalDataChannel.close(InternalDataChannel.java:275)
        at 
org.apache.hc.core5.reactor.InternalDataChannel.close(InternalDataChannel.java:257)
        at 
org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.onOutput(AbstractH2StreamMultiplexer.java:522)
        at 
org.apache.hc.core5.http2.impl.nio.AbstractH2IOEventHandler.outputReady(AbstractH2IOEventHandler.java:74)
        at 
org.apache.hc.core5.http2.impl.nio.ClientH2IOEventHandler.outputReady(ClientH2IOEventHandler.java:39)
        at 
org.apache.hc.core5.reactor.ssl.SSLIOSession.encryptData(SSLIOSession.java:588)
        at 
org.apache.hc.core5.reactor.ssl.SSLIOSession.access$600(SSLIOSession.java:72)
        at 
org.apache.hc.core5.reactor.ssl.SSLIOSession$1.outputReady(SSLIOSession.java:181)
        at 
org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent(InternalDataChannel.java:141)
        at 
org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:51)
        at 
org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:178)
        at 
org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:127)
        at 
org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:85)
        at 
org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44)
        at java.base/java.lang.Thread.run(Thread.java:834) {code}
And the underlying session was closed gracefully.

[https://github.com/apache/httpcomponents-core/blob/5.1.x/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractH2StreamMultiplexer.java#L543]

AbstractH2StreamMultiplexer.java will mark the connState as `SHUTDOWN` when 
timeout happens, and during processing the closed sessions when serving new 
requests, httpclient will throw `ConnectionClosedException`.

I will try to reproduce it locally.

 

*Regarding the bug fix, I was referring to this comment:*

ProtocolNegotiationException
exception, it happened at protocol negotiation phase, so it seems this issue 
was fixed in the last release:

ClientH2PrefaceHandler.java
{code:java}
@Override
public void inputReady(final IOSession session, final ByteBuffer src) throws 
IOException {
    if (src != null) {
        if (inBuf == null) {
            inBuf = BufferedData.allocate(src.remaining());
        }
        inBuf.put(src);
    }
    if (preface != null) {
        writeOutPreface(session);
    } else {
        throw new ProtocolNegotiationException("Unexpected input");
    }
} {code}
H2OnlyClientProtocolNegotiator.java in 5.1.2:

 
{code:java}
@Override
public void inputReady(final IOSession session, final ByteBuffer src) throws 
IOException {
    if (src != null) {
        throw new ProtocolNegotiationException("Unexpected input");
    }
    if (preface != null) {
        writeOutPreface(session);
    } else {
        throw new ProtocolNegotiationException("Unexpected input");
    }
} {code}
I will try to post a RB against 5.1.x branch.

Thanks

> ProtocolNegotiationException and ConnectionClosedException with httpclient5
> ---------------------------------------------------------------------------
>
>                 Key: HTTPCLIENT-2222
>                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2222
>             Project: HttpComponents HttpClient
>          Issue Type: Bug
>          Components: HttpClient (async)
>    Affects Versions: 5.1.2, 5.1.3
>         Environment: GNU/Linux 5.4 with JDK11.
>            Reporter: Gaojie Liu
>            Priority: Major
>
> We are using httpclient5 to talk HTTP/2 to a Netty H2 server and we are using 
> a pretty standard way to construct a HttpClient5 client as follows:
> {code:java}
> final IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
>     .setSoKeepAlive(true)
>     .setTcpNoDelay(true)
>     .setSoTimeout(Timeout.ofMilliseconds(requestTimeOutInMilliseconds))
>     .setIoThreadCount(ioThreadCount)
>     .build();
> final TlsStrategy tlsStrategy = skipCipherCheck ?
>     VeniceClientTlsStrategyBuilder.create()
>         .setSslContext(sslContext)
>         .setTlsVersions(TLS.V_1_3, TLS.V_1_2)
>         .build()
>     : ClientTlsStrategyBuilder.create()
>         .setSslContext(sslContext)
>         .setTlsVersions(TLS.V_1_3, TLS.V_1_2)
>         .build();
> final CloseableHttpAsyncClient client = 
> HttpAsyncClients.customHttp2().setTlsStrategy(tlsStrategy)
>     .setIOReactorConfig(ioReactorConfig)
>     .setDefaultRequestConfig(RequestConfig.custom()
>         
> .setResponseTimeout(Timeout.ofMilliseconds(requestTimeOutInMilliseconds))
>         
> .setConnectionRequestTimeout(Timeout.ofMilliseconds(requestTimeOutInMilliseconds))
>         
> .setConnectTimeout(Timeout.ofMilliseconds(connectTimeOutInMilliseconds))
>         .build())
>     .build();
> client.start(); {code}
> When we deployed this to prod, we discovered the following exceptions in the 
> first 30 mins and later, it seems become more stable:
> {code:java}
> org.apache.hc.core5.http.ConnectionClosedException: Connection is closed
>         at 
> org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.onDisconnect(AbstractH2StreamMultiplexer.java:568)
>  ~[httpcore5-h2-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.http2.impl.nio.AbstractH2IOEventHandler.disconnected(AbstractH2IOEventHandler.java:96)
>  ~[httpcore5-h2-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.http2.impl.nio.ClientH2IOEventHandler.disconnected(ClientH2IOEventHandler.java:39)
>  ~[httpcore5-h2-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.ssl.SSLIOSession$1.disconnected(SSLIOSession.java:212)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.InternalDataChannel.disconnected(InternalDataChannel.java:193)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.SingleCoreIOReactor.processClosedSessions(SingleCoreIOReactor.java:231)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:133)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:85)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44) 
> ~[httpcore5-5.1.2.jar:5.1.2]
>         at java.lang.Thread.run(Thread.java:834) 
> [?:?]org.apache.hc.core5.http2.impl.nio.ProtocolNegotiationException: 
> Unexpected input
>         at 
> org.apache.hc.core5.http2.impl.nio.H2OnlyClientProtocolNegotiator.inputReady(H2OnlyClientProtocolNegotiator.java:133)
>  ~[httpcore5-h2-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.ssl.SSLIOSession.decryptData(SSLIOSession.java:549)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.ssl.SSLIOSession.access$400(SSLIOSession.java:72) 
> ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.ssl.SSLIOSession$1.inputReady(SSLIOSession.java:172)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent(InternalDataChannel.java:131)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:51)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:178)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:127)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:85)
>  ~[httpcore5-5.1.2.jar:5.1.2]
>         at 
> org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44) 
> ~[httpcore5-5.1.2.jar:5.1.2]
>         at java.lang.Thread.run(Thread.java:834) [?:?] {code}
> Is it a known issue?
> We tried the latest release of httpclient5: 5.2-beta1, the 
> ConnectionClosedException exception would happen much more frequent.
> Let me know if you need more information.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

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

Reply via email to