This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/master by this push: new 3d977d6 Port NIO2 close refactoring to NIO 3d977d6 is described below commit 3d977d6138ae86725bbcb722036041a95425416a Author: remm <r...@apache.org> AuthorDate: Tue Apr 16 00:13:10 2019 +0200 Port NIO2 close refactoring to NIO Fix socket close discrepancies for NIO, now the wrapper close is used everywhere except for socket accept problems. --- java/org/apache/tomcat/util/net/NioEndpoint.java | 76 +++++++++++++++--------- webapps/docs/changelog.xml | 4 ++ 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/java/org/apache/tomcat/util/net/NioEndpoint.java b/java/org/apache/tomcat/util/net/NioEndpoint.java index 7a9e708..b869876 100644 --- a/java/org/apache/tomcat/util/net/NioEndpoint.java +++ b/java/org/apache/tomcat/util/net/NioEndpoint.java @@ -531,8 +531,10 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel> // processed. Count down the connections at this point // since it won't have been counted down when the socket // closed. - socket.socketWrapper.getEndpoint().countDownConnection(); - ((NioSocketWrapper) socket.socketWrapper).closed = true; + try { + socket.socketWrapper.close(); + } catch (Exception ignore) { + } } else { final NioSocketWrapper socketWrapper = (NioSocketWrapper) key.attachment(); if (socketWrapper != null) { @@ -685,25 +687,18 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel> } socketWrapper = (NioSocketWrapper) sk.attach(null); if (socketWrapper != null) { - // If attachment is non-null then there may be a current - // connection with an associated processor. - getHandler().release(socketWrapper); - } - if (sk.isValid()) sk.cancel(); - // If it is available, close the NioChannel first which should - // in turn close the underlying SocketChannel. The NioChannel - // needs to be closed first, if available, to ensure that TLS - // connections are shut down cleanly. - if (socketWrapper != null) { try { - socketWrapper.getSocket().close(true); - } catch (Exception e){ + socketWrapper.close(); + } catch (Exception e) { if (log.isDebugEnabled()) { log.debug(sm.getString( - "endpoint.debug.socketCloseFail"), e); + "endpoint.debug.channelCloseFail"), e); } } } + if (sk.isValid()) { + sk.cancel(); + } // The SocketChannel is also available via the SelectionKey. If // it hasn't been closed in the block above, close it now. if (sk.channel().isOpen()) { @@ -716,18 +711,6 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel> } } } - try { - if (socketWrapper != null && socketWrapper.getSendfileData() != null - && socketWrapper.getSendfileData().fchannel != null - && socketWrapper.getSendfileData().fchannel.isOpen()) { - socketWrapper.getSendfileData().fchannel.close(); - } - } catch (Exception ignore) { - } - if (socketWrapper != null) { - countDownConnection(); - socketWrapper.closed = true; - } } catch (Throwable e) { ExceptionUtils.handleThrowable(e); if (log.isDebugEnabled()) { @@ -1215,7 +1198,44 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel> @Override public void close() throws IOException { - getSocket().close(); + if (log.isDebugEnabled()) { + log.debug("Calling [" + getEndpoint() + "].closeSocket([" + this + "])", new Exception()); + } + try { + getEndpoint().getHandler().release(this); + } catch (Throwable e) { + ExceptionUtils.handleThrowable(e); + if (log.isDebugEnabled()) { + log.error("Channel close error", e); + } + } + try { + synchronized (getSocket()) { + if (!closed) { + closed = true; + getEndpoint().countDownConnection(); + } + if (getSocket().isOpen()) { + getSocket().close(true); + } + } + } catch (Throwable e) { + ExceptionUtils.handleThrowable(e); + if (log.isDebugEnabled()) { + log.error("Channel close error", e); + } + } + try { + SendfileData data = getSendfileData(); + if (data != null && data.fchannel != null && data.fchannel.isOpen()) { + data.fchannel.close(); + } + } catch (Throwable e) { + ExceptionUtils.handleThrowable(e); + if (log.isDebugEnabled()) { + log.error("Channel close error", e); + } + } } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index ed16730..4def071 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -61,6 +61,10 @@ <fix> Possible HTTP/2 connection leak issue when using async. (remm) </fix> + <fix> + Fix socket close discrepancies for NIO, now the wrapper close + is used everywhere except for socket accept problems. (remm) + </fix> </changelog> </subsection> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org