You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/12/17 01:17:18 UTC
svn commit: r1050249 - in /tomcat/trunk:
java/org/apache/coyote/http11/Http11NioProtocol.java
webapps/docs/changelog.xml
Author: markt
Date: Fri Dec 17 00:17:18 2010
New Revision: 1050249
URL: http://svn.apache.org/viewvc?rev=1050249&view=rev
Log:
Fix massive memory leak in NIO connector. Http11NioProcessor objects were not being recycled.
Modified:
tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
tomcat/trunk/webapps/docs/changelog.xml
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=1050249&r1=1050248&r2=1050249&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Fri Dec 17 00:17:18 2010
@@ -244,6 +244,10 @@ public class Http11NioProtocol extends A
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 A
}
}
+
+ 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 A
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 A
} 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;
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1050249&r1=1050248&r2=1050249&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Dec 17 00:17:18 2010
@@ -175,6 +175,10 @@
<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">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: svn commit: r1050249 - in /tomcat/trunk: java/org/apache/coyote/http11/Http11NioProtocol.java
webapps/docs/changelog.xml
Posted by Konstantin Kolinko <kn...@gmail.com>.
Is it worth being ported to 6.0? It looks so, though have not reviewed
it in detail yet.
2010/12/17 <ma...@apache.org>:
> Author: markt
> Date: Fri Dec 17 00:17:18 2010
> New Revision: 1050249
>
> URL: http://svn.apache.org/viewvc?rev=1050249&view=rev
> Log:
> Fix massive memory leak in NIO connector. Http11NioProcessor objects were not being recycled.
>
> Modified:
> tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
> tomcat/trunk/webapps/docs/changelog.xml
>
> 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=1050249&r1=1050248&r2=1050249&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original)
> +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Fri Dec 17 00:17:18 2010
> @@ -244,6 +244,10 @@ public class Http11NioProtocol extends A
> 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 A
> }
> }
>
> +
> + 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 A
> 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 A
> } 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;
>
>
> Modified: tomcat/trunk/webapps/docs/changelog.xml
> URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1050249&r1=1050248&r2=1050249&view=diff
> ==============================================================================
> --- tomcat/trunk/webapps/docs/changelog.xml (original)
> +++ tomcat/trunk/webapps/docs/changelog.xml Fri Dec 17 00:17:18 2010
> @@ -175,6 +175,10 @@
> <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">
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org