From: markt Date: Fri, 17 Dec 2010 00:17:18 +0000 (+0000) Subject: Fix massive memory leak in NIO connector. Http11NioProcessor objects were not being... X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=25981f180d403b0e5f8d41cf4cc045f61b206883;p=tomcat7.0 Fix massive memory leak in NIO connector. Http11NioProcessor objects were not being recycled. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1050249 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/coyote/http11/Http11NioProtocol.java b/java/org/apache/coyote/http11/Http11NioProtocol.java index 15d8a869a..84cc0a494 100644 --- a/java/org/apache/coyote/http11/Http11NioProtocol.java +++ b/java/org/apache/coyote/http11/Http11NioProtocol.java @@ -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; diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index fa6879167..bb54e2d51 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -175,6 +175,10 @@ Connector.stop(). This fix also includes further Lifecycle refactoring for Connectors and associated components. (markt) + + Remove a huge memory leak in the NIO connector introduced by the fix + for 49884. (markt) +