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

Reply via email to