Fix massive memory leak in NIO connector. Http11NioProcessor objects were not being...
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Fri, 17 Dec 2010 00:17:18 +0000 (00:17 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Fri, 17 Dec 2010 00:17:18 +0000 (00:17 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1050249 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/coyote/http11/Http11NioProtocol.java
webapps/docs/changelog.xml

index 15d8a86..84cc0a4 100644 (file)
@@ -244,6 +244,10 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol {
                 log.debug("Done iterating through our connections to release a socket channel:"+socket +" released:"+released);
         }
         
+        /**
+         * Use this only if the processor is not available, otherwise use
+         * {@link #release(NioChannel, Http11NioProcessor).
+         */
         @Override
         public void release(NioChannel socket) {
             Http11NioProcessor result = connections.remove(socket);
@@ -253,6 +257,14 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol {
             }
         }
 
+
+        public void release(NioChannel socket, Http11NioProcessor processor) {
+            connections.remove(socket);
+            processor.recycle();
+            recycledProcessors.offer(processor);
+        }
+
+
         @Override
         public SocketState event(NioChannel socket, SocketStatus status) {
             Http11NioProcessor processor = connections.get(socket);
@@ -294,7 +306,7 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol {
                         state = processor.asyncPostProcess();
                     }
                     if (state == SocketState.OPEN || state == SocketState.CLOSED) {
-                        release(socket);
+                        release(socket, processor);
                         if (state == SocketState.OPEN) {
                             socket.getPoller().add(socket);
                         }
@@ -362,11 +374,11 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol {
                 } else if (state == SocketState.OPEN){
                     // In keep-alive but between requests. OK to recycle
                     // processor. Continue to poll for the next request.
-                    release(socket);
+                    release(socket, processor);
                     socket.getPoller().add(socket);
                 } else {
                     // Connection closed. OK to recycle the processor.
-                    release(socket);
+                    release(socket, processor);
                 }
                 return state;
 
index fa68791..bb54e2d 100644 (file)
         <code>Connector.stop()</code>. This fix also includes further Lifecycle
         refactoring for Connectors and associated components. (markt)
       </fix>
+      <fix>
+        Remove a huge memory leak in the NIO connector introduced by the fix
+        for <bug>49884</bug>. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Jasper">