Author: remm
Date: Fri Dec 21 13:23:26 2018
New Revision: 1849473
URL: http://svn.apache.org/viewvc?rev=1849473&view=rev
Log:
63022: Do not use the socket open state when using the wrapper isClosed method
for NIO and NIO2, as it will disable all further processing. Fix socket close
discrepancies for NIO2, now the wrapper close is used everywhere except for
socket accept problems.
Modified:
tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java?rev=1849473&r1=1849472&r2=1849473&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java Fri Dec
21 13:23:26 2018
@@ -1302,6 +1302,12 @@ public abstract class AbstractEndpoint<S
protected abstract boolean setSocketOptions(U socket);
+ /**
+ * Close the socket when the connection has to be immediately closed when
+ * an error occurs while configuring the accepted socket, allocating
+ * a wrapper for the socket, or trying to dispatch it for processing.
+ * @param socket The newly accepted socket
+ */
protected abstract void closeSocket(U socket);
protected void destroySocket(U socket) {
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1849473&r1=1849472&r2=1849473&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Fri Dec 21
13:23:26 2018
@@ -226,7 +226,7 @@ public class Nio2Endpoint extends Abstra
// Then close all active connections if any remain
try {
for (Nio2Channel channel :
getHandler().getOpenSockets()) {
- closeSocket(channel.getSocket());
+ channel.getSocket().close();
}
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
@@ -378,47 +378,6 @@ public class Nio2Endpoint extends Abstra
}
- private void closeSocket(SocketWrapperBase<Nio2Channel> socket) {
- if (log.isDebugEnabled()) {
- log.debug("Calling [" + this + "].closeSocket([" + socket + "],["
+ socket.getSocket() + "])",
- new Exception());
- }
- if (socket == null) {
- return;
- }
- try {
- getHandler().release(socket);
- } catch (Throwable e) {
- ExceptionUtils.handleThrowable(e);
- if (log.isDebugEnabled()) log.error("",e);
- }
- Nio2SocketWrapper nio2Socket = (Nio2SocketWrapper) socket;
- try {
- synchronized (socket.getSocket()) {
- if (!nio2Socket.closed) {
- nio2Socket.closed = true;
- countDownConnection();
- }
- if (socket.getSocket().isOpen()) {
- socket.getSocket().close(true);
- }
- }
- } catch (Throwable e) {
- ExceptionUtils.handleThrowable(e);
- if (log.isDebugEnabled()) log.error("",e);
- }
- try {
- if (nio2Socket.getSendfileData() != null
- && nio2Socket.getSendfileData().fchannel != null
- && nio2Socket.getSendfileData().fchannel.isOpen()) {
- nio2Socket.getSendfileData().fchannel.close();
- }
- } catch (Throwable e) {
- ExceptionUtils.handleThrowable(e);
- if (log.isDebugEnabled()) log.error("",e);
- }
- }
-
protected class Nio2Acceptor extends Acceptor<AsynchronousSocketChannel>
implements CompletionHandler<AsynchronousSocketChannel, Void> {
@@ -928,14 +887,50 @@ public class Nio2Endpoint extends Abstra
@Override
- public void close() throws IOException {
- getSocket().close();
+ public void 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);
+ }
+ }
}
-
@Override
public boolean isClosed() {
- return closed || !getSocket().isOpen();
+ return closed;
}
@@ -1775,7 +1770,7 @@ public class Nio2Endpoint extends Abstra
}
if (state == SocketState.CLOSED) {
// Close socket and pool
- closeSocket(socketWrapper);
+ socketWrapper.close();
if (running && !paused) {
if (!nioChannels.push(socketWrapper.getSocket())) {
socketWrapper.getSocket().free();
@@ -1785,7 +1780,7 @@ public class Nio2Endpoint extends Abstra
launch = true;
}
} else if (handshake == -1 ) {
- closeSocket(socketWrapper);
+ socketWrapper.close();
if (running && !paused) {
if (!nioChannels.push(socketWrapper.getSocket())) {
socketWrapper.getSocket().free();
@@ -1797,7 +1792,7 @@ public class Nio2Endpoint extends Abstra
} catch (Throwable t) {
log.error(sm.getString("endpoint.processing.fail"), t);
if (socketWrapper != null) {
- closeSocket(socketWrapper);
+ ((Nio2SocketWrapper) socketWrapper).close();
}
} finally {
if (launch) {
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1849473&r1=1849472&r2=1849473&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Fri Dec 21
13:23:26 2018
@@ -1168,7 +1168,7 @@ public class NioEndpoint extends Abstrac
@Override
public boolean isClosed() {
- return closed || !getSocket().isOpen();
+ return closed;
}
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1849473&r1=1849472&r2=1849473&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Dec 21 13:23:26 2018
@@ -86,6 +86,15 @@
header in HTTP/2 responses where an appropriate value is available.
(markt)
</add>
+ <fix>
+ <bug>63022</bug>: Do not use the socket open state when using the
+ wrapper isClosed method for NIO and NIO2, as it will disable all
+ further processing. (remm)
+ </fix>
+ <fix>
+ Fix socket close discrepancies for NIO2, now the wrapper close
+ is used everywhere except for socket accept problems. (remm)
+ </fix>
</changelog>
</subsection>
<subsection name="Tribes">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]