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: [email protected]
For additional commands, e-mail: [email protected]