Hi Oleg,

I would like to know whether you would include this fix in 4.4.x branch and
do a release in the near future.

Thanks in Advance,

Regards,
Arunan

On Wed, Oct 21, 2020 at 11:01 PM Arunan Sugunakumar <[email protected]> wrote:

> Hi Oleg,
>
> Also, fix[1] you attached, resolves the issue in our server.
>
> [1] -
> https://github.com/ok2c/httpcomponents-core/commit/bf12c7dd9eabf0cd75bd6c70ac6b285b0d4430a5
>
> Thanks & Regards,
> Arunan
>
> On Wed, Oct 21, 2020 at 10:57 PM Arunan Sugunakumar <[email protected]>
> wrote:
>
>> Hi Oleg,
>>
>> Thank you for confirming the bug. Please find the JIRA[1].
>>
>> [1] - https://issues.apache.org/jira/browse/HTTPCORE-644
>>
>> Regards,
>> Arunan
>>
>> On Wed, Oct 21, 2020 at 9:46 PM Oleg Kalnichevski <[email protected]>
>> wrote:
>>
>>> Arunan,
>>>
>>> I confirm this is a bug in HttpCore likely affecting all versions
>>> (4.4.x, 5.0.x and 5.1.x).
>>>
>>> Please raise a JIRA for this defect.
>>>
>>> Please try out this fix and let me know if that resolves the issue for
>>> you.
>>>
>>>
>>> https://github.com/ok2c/httpcomponents-core/commit/bf12c7dd9eabf0cd75bd6c70ac6b285b0d4430a5
>>>
>>>
>>> Oleg
>>>
>>> On Wed, 2020-10-21 at 12:09 +0200, Oleg Kalnichevski wrote:
>>> > On Wed, 2020-10-21 at 00:25 +0530, Arunan Sugunakumar wrote:
>>> > > Hi Oleg,
>>> > >
>>> > > I was able to write a simple Test Server that reproduces this
>>> > > issue.
>>> > > I changed the NHttpFileServer example to come up with an example.
>>> > > If
>>> > > you send a POST request with a dummy payload and a
>>> > > "Connection:close"
>>> > > header to this server in 8443 port, you can see that the connection
>>> > > will not be closed (JDK11 & JDK8_261) and the CPU will be spinning
>>> > > continuously processing Write Events. If you start the same server
>>> > > in
>>> > > JDK8 (JDK8_251), the session will close normally.
>>> > >
>>> > > Please go through the example and provide your suggestions.
>>> > >
>>> > > Regards,
>>> > > Arunan
>>> > >
>>> >
>>> > Hi Arunan
>>> >
>>> > I was able to reproduce the issue with Oracle Java 11.0.8 which is a
>>> > reasonably up to date Java 11 runtime. However at the moment I do not
>>> > know whether this is a bug in Oracle's TLSv1.3 implementation or that
>>> > in HttpCore. It will likely take me a few days to complete the
>>> > analysis
>>> > and come up a fix.
>>> >
>>> > Oleg
>>> >
>>> >
>>> > > On Tue, Oct 13, 2020 at 11:07 AM Oleg Kalnichevski <
>>> > > [email protected]>
>>> > > wrote:
>>> > > > On Tue, 2020-10-13 at 08:42 +0530, Arunan Sugunakumar wrote:
>>> > > > > Hi Oleg,
>>> > > > >
>>> > > > > I upgraded to 4.4.13. Still the issue is there.
>>> > > > >
>>> > > >
>>> > > > Provide a reproducer.
>>> > > >
>>> > > > Oleg
>>> > > >
>>> > > > > Regards,
>>> > > > > Arunan
>>> > > > >
>>> > > > > On Mon, Oct 12, 2020, 20:56 Oleg Kalnichevski <[email protected]
>>> > > > > >
>>> > > > > wrote:
>>> > > > >
>>> > > > > > On Sun, 2020-10-11 at 22:16 +0530, Arunan Sugunakumar wrote:
>>> > > > > > > Hi,
>>> > > > > > >
>>> > > > > > > We have used httpcore-NIO to implement a non-blocking
>>> > > > > > > server
>>> > > > and
>>> > > > > > > with
>>> > > > > > > a recent JAVA upgrade, we are finding a high CPU usage in
>>> > > > > > > our
>>> > > > > > > servers. While we debugged, we found out that when we close
>>> > > > the
>>> > > > > > > HTTPS
>>> > > > > > > connection on the server-side, the WRITE event is getting
>>> > > > > > > fired continuously and the connection close is
>>> > > > > > > unsuccessful.
>>> > > > > > >
>>> > > > > > > To explain the code, we have extended
>>> > > > DefaultNHttpConnectionBase
>>> > > > > > > with
>>> > > > > > > our own ServerConnection, and inside close() we simply just
>>> > > > call
>>> > > > > > > the
>>> > > > > > > close() method of the NHttpConnectionBase[1]. If we look at
>>> > > > the
>>> > > > > > > code
>>> > > > > > > below, the close method sets the status as CLOSING and
>>> > > > > > > after
>>> > > > that
>>> > > > > > > either sets the WRITE event in the session or tries to
>>> > > > > > > close
>>> > > > the
>>> > > > > > > session (SSLIOSession in our case).
>>> > > > > > >
>>> > > > > > > @Override
>>> > > > > > > public void close() throws IOException {
>>> > > > > > >     if (this.status != ACTIVE) {
>>> > > > > > >         return;
>>> > > > > > >     }
>>> > > > > > >     this.status = CLOSING;
>>> > > > > > >     if (this.outbuf.hasData()) {
>>> > > > > > >         this.session.setEvent(EventMask.WRITE);
>>> > > > > > >     } else {
>>> > > > > > >         this.session.close();
>>> > > > > > >         this.status = CLOSED;
>>> > > > > > >     }
>>> > > > > > > }
>>> > > > > > >
>>> > > > > > > Inside SSLIOSession close(), the updateEventMask() [2] is
>>> > > > called.
>>> > > > > > > @Override
>>> > > > > > > public synchronized void close() {
>>> > > > > > >     if (this.status >= CLOSING) {
>>> > > > > > >         return;
>>> > > > > > >     }
>>> > > > > > >     this.status = CLOSING;
>>> > > > > > >     if (this.session.getSocketTimeout() == 0) {
>>> > > > > > >         this.session.setSocketTimeout(1000);
>>> > > > > > >     }
>>> > > > > > >     try {
>>> > > > > > >         updateEventMask();
>>> > > > > > >     } catch (final CancelledKeyException ex) {
>>> > > > > > >         shutdown();
>>> > > > > > >     }
>>> > > > > > > }
>>> > > > > > >
>>> > > > > > > Inside updateEventMask() method, we get the HandshakeStatus
>>> > > > from
>>> > > > > > > the
>>> > > > > > > JAVA SSLEngine, and set a new Mask based on the status.
>>> > > > > > > switch (this.sslEngine.getHandshakeStatus()) {
>>> > > > > > > case NEED_WRAP:
>>> > > > > > >     newMask = EventMask.READ_WRITE;
>>> > > > > > >     break;
>>> > > > > > > case NEED_UNWRAP:
>>> > > > > > >     newMask = EventMask.READ;
>>> > > > > > >     break;
>>> > > > > > > case NOT_HANDSHAKING:
>>> > > > > > >     newMask = this.appEventMask;
>>> > > > > > >     break;
>>> > > > > > > case NEED_TASK:
>>> > > > > > >     break;
>>> > > > > > > case FINISHED:
>>> > > > > > >     break;
>>> > > > > > > }
>>> > > > > > > Before JDK upgrade, when outbound is closed, we used to get
>>> > > > the
>>> > > > > > > status as NEED_UNWRAP which sets the newMask as READ mask
>>> > > > which
>>> > > > > > > closes the connection in our server perfectly.
>>> > > > > > > But with a recent JDK commit[3], the new status is returned
>>> > > > as
>>> > > > > > > NOT_HANDSHAKING.
>>> > > > > > > Since mask is not set to READ because of the
>>> > > > > > > NOT_HANDSHAKING
>>> > > > > > > status,
>>> > > > > > > WRITE event is continuously getting fired which makes the
>>> > > > Server
>>> > > > > > > connection close unsuccessful.
>>> > > > > > > When the close is called multiple times for multiple
>>> > > > connections,
>>> > > > > > > we
>>> > > > > > > could observe that CPU usage increased continuosly and
>>> > > > reached
>>> > > > > > > 100
>>> > > > > > > percent and stays there continuously.
>>> > > > > > > When I look at the stack trace, the execution flow was
>>> > > > completely
>>> > > > > > > inside the httpcore-nio component, which made our attempt
>>> > > > > > > to
>>> > > > > > > clear
>>> > > > > > > the Event from the server implementation, unsuccessful.
>>> > > > > > >
>>> > > > > > >
>>> > > > > > > Earlier we were using Httpcore-NIO version 4.3.3. With this
>>> > > > > > > issue, we
>>> > > > > > > tried upgrading to 4.4.13. But still the issue exists.
>>> > > > > >
>>> > > > > > I have seen no evidence supporting that. Please upgrade to
>>> > > > 4.4.13.
>>> > > > > > Oleg
>>> > > > > >
>>> > > > > >
>>> > > > > >
>>> > > > > > -------------------------------------------------------------
>>> > > > ----
>>> > > > > > ----
>>> > > > > > To unsubscribe, e-mail: [email protected]
>>> > > > > > For additional commands, e-mail: [email protected]
>>> > > > > >
>>> > > > > >
>>> > > >
>>> > > > -----------------------------------------------------------------
>>> > > > ----
>>> > > > To unsubscribe, e-mail: [email protected]
>>> > > > For additional commands, e-mail: [email protected]
>>> > > >
>>> > >
>>> > > -----------------------------------------------------------------
>>> > > ----
>>> > > To unsubscribe, e-mail: [email protected]
>>> > > For additional commands, e-mail: [email protected]
>>> >
>>> > ---------------------------------------------------------------------
>>> > To unsubscribe, e-mail: [email protected]
>>> > For additional commands, e-mail: [email protected]
>>> >
>>>
>>>
>>
>> --
>> *Sugunakumar Arunan*
>> Software Engineer | WSO2
>>
>> Email : [email protected]
>> Mobile : +94766016272
>> Web : http://wso2.com
>> <https://wso2.com/signature>
>>
>
>
> --
> *Sugunakumar Arunan*
> Software Engineer | WSO2
>
> Email : [email protected]
> Mobile : +94766016272
> Web : http://wso2.com
> <https://wso2.com/signature>
>


-- 
*Sugunakumar Arunan*
Software Engineer | WSO2

Email : [email protected]
Mobile : +94766016272
Web : http://wso2.com
<https://wso2.com/signature>

Reply via email to