Hi Gary, Thank you for the suggestion. So far we could not upgrade to version 5, because as you said it requires significant changes in our code. But I am still not sure whether it would resolve the issue, because it has the same switch block[1] as 4.4.13. I wondering whether any of the other users got the same issue and if so, how they tackled it.
[1] - https://github.com/apache/httpcomponents-core/blob/master/httpcore5/src/main/java/org/apache/hc/core5/reactor/ssl/SSLIOSession.java#L420 Thanks & Regards, Arunan On Sun, Oct 11, 2020, 22:30 Gary Gregory <[email protected]> wrote: > Hi, > > Have you considered upgrading to version 5? This would require code updates > though. > > Gary > > On Sun, Oct 11, 2020, 12:47 Arunan Sugunakumar <[email protected]> > 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. > > > > [image: Screenshot 2020-10-11 at 21.53.29.png] > > > > 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. The issue exists > only for HTTPS connection (where we use SSLIOSession) and not for HTTP > connections. > > > > We observed the issue with the following JDK versions (which the > contains the commit[3]). > > * Oracle JDK 1.8.0_261 (released in July 2020) > > * AdoptOpenJDK (build 11.0.8+10) > > * All versions after Oracle JDK 11.0.1 > > > > > > It would be much helpful for us, if any help can be provided to resolve > this issue. > > > > [1] - > > > https://github.com/apache/httpcomponents-core/blob/rel/v4.4.13/httpcore-nio/src/main/java/org/apache/http/impl/nio/NHttpConnectionBase.java#L507 > > [2] - > > > https://github.com/apache/httpcomponents-core/blob/rel/v4.4.13/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java#L642 > > [3] - > > > https://github.com/AdoptOpenJDK/openjdk-jdk11u/commit/8d1b63a4db2c6348a97b3cf45bd4d2caa7cad6b5#diff-e3c7d4bd31fed54c9607b6e0b6b2d43cL589 > > > > > > Thanks in Advance. > > > > Regards, > > Arunan > > > > -- > > *Sugunakumar Arunan* > > Software Engineer | WSO2 > > > > Email : [email protected] > > Mobile : +94766016272 > > Web : http://wso2.com > > <https://wso2.com/signature> > > >
