Author: markt Date: Thu May 28 13:25:52 2015 New Revision: 1682240 URL: http://svn.apache.org/r1682240 Log: Fix various errors when stopping the APR connector via JMX (may occur in other scenarios) - prevent a crash by ensuring all connections are closed via the SocketWrapper - prevent a memory leak by releasing any Processor associated with a closed connection Adds release(SocketWrapper) to the Handler interface and adds an implementation to the base AbstractProtocol.AbstractConnectionHandler (replacing the impl. in vaious sub-classes)
Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/trunk/java/org/apache/coyote/ajp/AjpNio2Protocol.java tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1682240&r1=1682239&r2=1682240&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Thu May 28 13:25:52 2015 @@ -868,6 +868,23 @@ public abstract class AbstractProtocol<S } + /** + * Expected to be used by the Endpoint to release resources on socket + * close, errors etc. + */ + @Override + public void release(SocketWrapperBase<S> socketWrapper) { + S socket = socketWrapper.getSocket(); + if (socket != null) { + Processor processor = connections.remove(socket); + if (processor != null) { + processor.recycle(); + recycledProcessors.push(processor); + } + } + } + + protected abstract Processor createUpgradeProcessor( SocketWrapperBase<?> socket, ByteBuffer leftoverInput, HttpUpgradeHandler httpUpgradeHandler) throws IOException; Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpNio2Protocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpNio2Protocol.java?rev=1682240&r1=1682239&r2=1682240&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpNio2Protocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpNio2Protocol.java Thu May 28 13:25:52 2015 @@ -16,13 +16,11 @@ */ package org.apache.coyote.ajp; -import org.apache.coyote.Processor; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.Nio2Channel; import org.apache.tomcat.util.net.Nio2Endpoint; import org.apache.tomcat.util.net.Nio2Endpoint.Handler; -import org.apache.tomcat.util.net.SocketWrapperBase; /** @@ -71,20 +69,6 @@ public class AjpNio2Protocol extends Abs } - /** - * Expected to be used by the Poller to release resources on socket - * close, errors etc. - */ - @Override - public void release(SocketWrapperBase<Nio2Channel> socket) { - Processor processor = connections.remove(socket.getSocket()); - if (processor != null) { - processor.recycle(); - recycledProcessors.push(processor); - } - } - - @Override public void closeAll() { for (Nio2Channel channel : connections.keySet()) { Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java?rev=1682240&r1=1682239&r2=1682240&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProtocol.java Thu May 28 13:25:52 2015 @@ -25,7 +25,6 @@ import org.apache.juli.logging.LogFactor import org.apache.tomcat.util.net.NioChannel; import org.apache.tomcat.util.net.NioEndpoint; import org.apache.tomcat.util.net.NioEndpoint.Handler; -import org.apache.tomcat.util.net.SocketWrapperBase; /** * This the NIO based protocol handler implementation for AJP. @@ -96,19 +95,5 @@ public class AjpNioProtocol extends Abst log.debug(sm.getString("ajpnioprotocol.releaseEnd", socket, Boolean.valueOf(released))); } - - - /** - * Expected to be used by the Poller to release resources on socket - * close, errors etc. - */ - @Override - public void release(SocketWrapperBase<NioChannel> socket) { - Processor processor = connections.remove(socket.getSocket()); - if (processor != null) { - processor.recycle(); - recycledProcessors.push(processor); - } - } } } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java?rev=1682240&r1=1682239&r2=1682240&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Nio2Protocol.java Thu May 28 13:25:52 2015 @@ -16,13 +16,11 @@ */ package org.apache.coyote.http11; -import org.apache.coyote.Processor; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.Nio2Channel; import org.apache.tomcat.util.net.Nio2Endpoint; import org.apache.tomcat.util.net.Nio2Endpoint.Handler; -import org.apache.tomcat.util.net.SocketWrapperBase; /** @@ -72,23 +70,6 @@ public class Http11Nio2Protocol extends return log; } - /** - * Expected to be used by the Endpoint to release resources on socket - * close, errors etc. - */ - @Override - public void release(SocketWrapperBase<Nio2Channel> socketWrapper) { - Nio2Channel socket = socketWrapper.getSocket(); - if (socket != null) { - Processor processor = connections.remove(socket); - if (processor != null) { - processor.recycle(); - recycledProcessors.push(processor); - } - } - } - - @Override public void closeAll() { for (Nio2Channel channel : connections.keySet()) { Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java?rev=1682240&r1=1682239&r2=1682240&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Thu May 28 13:25:52 2015 @@ -25,7 +25,6 @@ import org.apache.juli.logging.LogFactor import org.apache.tomcat.util.net.NioChannel; import org.apache.tomcat.util.net.NioEndpoint; import org.apache.tomcat.util.net.NioEndpoint.Handler; -import org.apache.tomcat.util.net.SocketWrapperBase; /** @@ -132,21 +131,5 @@ public class Http11NioProtocol extends A if (log.isDebugEnabled()) log.debug("Done iterating through our connections to release a socket channel:"+socket +" released:"+released); } - - /** - * Expected to be used by the Endpoint to release resources on socket - * close, errors etc. - */ - @Override - public void release(SocketWrapperBase<NioChannel> socketWrapper) { - NioChannel socket = socketWrapper.getSocket(); - if (socket != null) { - Processor processor = connections.remove(socket); - if (processor != null) { - processor.recycle(); - recycledProcessors.push(processor); - } - } - } } } 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=1682240&r1=1682239&r2=1682240&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java Thu May 28 13:25:52 2015 @@ -86,6 +86,14 @@ public abstract class AbstractEndpoint<S /** + * Release any resources associated with the given SocketWrapper. + * + * @param socketWrapper The socketWrapper to release resources for + */ + public void release(SocketWrapperBase<S> socketWrapper); + + + /** * Recycle resources associated with the handler. */ public void recycle(); Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1682240&r1=1682239&r2=1682240&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Thu May 28 13:25:52 2015 @@ -661,6 +661,14 @@ public class AprEndpoint extends Abstrac if (running) { running = false; poller.stop(); + for (SocketWrapperBase<Long> socketWrapper : connections.values()) { + try { + socketWrapper.close(); + handler.release(socketWrapper); + } catch (IOException e) { + // Ignore + } + } getAsyncTimeout().stop(); for (AbstractEndpoint.Acceptor acceptor : acceptors) { long waitLeft = 10000; 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=1682240&r1=1682239&r2=1682240&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Thu May 28 13:25:52 2015 @@ -1571,7 +1571,6 @@ public class Nio2Endpoint extends Abstra * thread local fields. */ public interface Handler extends AbstractEndpoint.Handler<Nio2Channel> { - public void release(SocketWrapperBase<Nio2Channel> socket); public void closeAll(); } 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=1682240&r1=1682239&r2=1682240&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Thu May 28 13:25:52 2015 @@ -1455,7 +1455,6 @@ public class NioEndpoint extends Abstrac * thread local fields. */ public interface Handler extends AbstractEndpoint.Handler<NioChannel> { - public void release(SocketWrapperBase<NioChannel> socket); public void release(SocketChannel socket); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org