From 5cd877cb71cb73da119b7b9a23c8a38344efeeed Mon Sep 17 00:00:00 2001 From: markt Date: Tue, 7 Dec 2010 00:08:38 +0000 Subject: [PATCH] Re-factoring in support of https://issues.apache.org/bugzilla/show_bug.cgi?id=50360 Pull up the concrete destroy() method - required a fair bit of refactoring Pull up the abstract init() method() git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1042873 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/coyote/AbstractProtocolHandler.java | 30 ++++++++++++++++++++++ java/org/apache/coyote/LocalStrings.properties | 2 ++ .../org/apache/coyote/ajp/AbstractAjpProtocol.java | 13 ---------- java/org/apache/coyote/ajp/AjpAprProtocol.java | 14 +++++++--- java/org/apache/coyote/ajp/AjpProtocol.java | 14 +++++++--- java/org/apache/coyote/ajp/LocalStrings.properties | 1 - .../coyote/http11/AbstractHttp11Protocol.java | 17 ------------ .../apache/coyote/http11/Http11AprProtocol.java | 21 +++++++-------- .../apache/coyote/http11/Http11NioProtocol.java | 12 +++++---- java/org/apache/coyote/http11/Http11Protocol.java | 20 +++++++-------- .../apache/tomcat/util/net/AbstractEndpoint.java | 10 ++++++-- java/org/apache/tomcat/util/net/AprEndpoint.java | 2 ++ java/org/apache/tomcat/util/net/JIoEndpoint.java | 1 + java/org/apache/tomcat/util/net/NioEndpoint.java | 3 +-- 14 files changed, 92 insertions(+), 68 deletions(-) diff --git a/java/org/apache/coyote/AbstractProtocolHandler.java b/java/org/apache/coyote/AbstractProtocolHandler.java index 4b3d33b6e..39c43154b 100644 --- a/java/org/apache/coyote/AbstractProtocolHandler.java +++ b/java/org/apache/coyote/AbstractProtocolHandler.java @@ -26,6 +26,7 @@ import javax.management.MBeanServer; import javax.management.ObjectName; import org.apache.juli.logging.Log; +import org.apache.tomcat.util.modeler.Registry; import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.AbstractEndpoint.Handler; import org.apache.tomcat.util.res.StringManager; @@ -332,4 +333,33 @@ public abstract class AbstractProtocolHandler implements ProtocolHandler, public void postDeregister() { // NOOP } + + + // ------------------------------------------------------- Lifecycle methods + + // TODO Keep current state and check for invalid transitions + + @Override + public abstract void init() throws Exception; + + + @Override + public final void destroy() { + if(getLog().isInfoEnabled()) { + getLog().info(sm.getString("abstractProtocolHandler.destroy", + getName())); + } + try { + endpoint.destroy(); + } catch (Exception e) { + getLog().error(sm.getString( + "abstractProtocolHandler.endPointDestroyError", getName()), + e); + } + + if( tpOname!=null ) + Registry.getRegistry(null, null).unregisterComponent(tpOname); + if( rgOname != null ) + Registry.getRegistry(null, null).unregisterComponent(rgOname); + } } diff --git a/java/org/apache/coyote/LocalStrings.properties b/java/org/apache/coyote/LocalStrings.properties index 891b5e0dd..32fe65e7d 100644 --- a/java/org/apache/coyote/LocalStrings.properties +++ b/java/org/apache/coyote/LocalStrings.properties @@ -15,5 +15,7 @@ abstractProtocolHandler.getAttribute=Get attribute [{0}] with value [{1}] abstractProtocolHandler.setAttribute=Set attribute [{0}] with value [{1}] +abstractProtocolHandler.endPointDestroyError=Failed to destroy end point associated with ProtocolHandler [{0}] +abstractProtocolHandler.destroy=Destroying ProtocolHandler [{0}] asyncStateMachine.invalidAsyncState=Calling [{0}] is not valid for a request with Async state [{1}] diff --git a/java/org/apache/coyote/ajp/AbstractAjpProtocol.java b/java/org/apache/coyote/ajp/AbstractAjpProtocol.java index cb666b310..3a7151790 100644 --- a/java/org/apache/coyote/ajp/AbstractAjpProtocol.java +++ b/java/org/apache/coyote/ajp/AbstractAjpProtocol.java @@ -17,7 +17,6 @@ package org.apache.coyote.ajp; import org.apache.coyote.AbstractProtocolHandler; -import org.apache.tomcat.util.modeler.Registry; import org.apache.tomcat.util.res.StringManager; public abstract class AbstractAjpProtocol extends AbstractProtocolHandler { @@ -114,16 +113,4 @@ public abstract class AbstractAjpProtocol extends AbstractProtocolHandler { if (getLog().isInfoEnabled()) getLog().info(sm.getString("ajpprotocol.stop", getName())); } - - - @Override - public void destroy() throws Exception { - if (getLog().isInfoEnabled()) - getLog().info(sm.getString("ajpprotocol.destroy", getName())); - endpoint.destroy(); - if (tpOname!=null) - Registry.getRegistry(null, null).unregisterComponent(tpOname); - if (rgOname != null) - Registry.getRegistry(null, null).unregisterComponent(rgOname); - } } diff --git a/java/org/apache/coyote/ajp/AjpAprProtocol.java b/java/org/apache/coyote/ajp/AjpAprProtocol.java index 348aeb28a..241a50d5d 100644 --- a/java/org/apache/coyote/ajp/AjpAprProtocol.java +++ b/java/org/apache/coyote/ajp/AjpAprProtocol.java @@ -151,10 +151,6 @@ public class AjpAprProtocol extends AbstractAjpProtocol { protected AjpAprProtocol proto; protected AtomicLong registerCount = new AtomicLong(0); protected RequestGroupInfo global = new RequestGroupInfo(); - @Override - public RequestGroupInfo getGlobal() { - return global; - } protected ConcurrentHashMap, AjpAprProcessor> connections = new ConcurrentHashMap, AjpAprProcessor>(); @@ -203,6 +199,16 @@ public class AjpAprProtocol extends AbstractAjpProtocol { this.proto = proto; } + @Override + public RequestGroupInfo getGlobal() { + return global; + } + + @Override + public void recycle() { + recycledProcessors.clear(); + } + // FIXME: Support for this could be added in AJP as well @Override public SocketState event(SocketWrapper socket, SocketStatus status) { diff --git a/java/org/apache/coyote/ajp/AjpProtocol.java b/java/org/apache/coyote/ajp/AjpProtocol.java index 1d06516d1..da8a3dc74 100644 --- a/java/org/apache/coyote/ajp/AjpProtocol.java +++ b/java/org/apache/coyote/ajp/AjpProtocol.java @@ -140,10 +140,6 @@ public class AjpProtocol extends AbstractAjpProtocol { protected AjpProtocol proto; protected AtomicLong registerCount = new AtomicLong(0); protected RequestGroupInfo global = new RequestGroupInfo(); - @Override - public RequestGroupInfo getGlobal() { - return global; - } protected ConcurrentHashMap, AjpProcessor> connections = new ConcurrentHashMap, AjpProcessor>(); @@ -193,6 +189,16 @@ public class AjpProtocol extends AbstractAjpProtocol { } @Override + public RequestGroupInfo getGlobal() { + return global; + } + + @Override + public void recycle() { + recycledProcessors.clear(); + } + + @Override public SocketState process(SocketWrapper socket) { return process(socket,SocketStatus.OPEN); } diff --git a/java/org/apache/coyote/ajp/LocalStrings.properties b/java/org/apache/coyote/ajp/LocalStrings.properties index 5432223cb..edbefe117 100644 --- a/java/org/apache/coyote/ajp/LocalStrings.properties +++ b/java/org/apache/coyote/ajp/LocalStrings.properties @@ -23,7 +23,6 @@ # AjpAprProtocol # -ajpprotocol.destroy=Destroying Coyote AJP/1.3 on {0} ajpprotocol.endpoint.initerror=Error initializing endpoint ajpprotocol.endpoint.starterror=Error starting endpoint ajpprotocol.endpoint.stoperror=Error stopping endpoint diff --git a/java/org/apache/coyote/http11/AbstractHttp11Protocol.java b/java/org/apache/coyote/http11/AbstractHttp11Protocol.java index 81b2ed41d..84f232724 100644 --- a/java/org/apache/coyote/http11/AbstractHttp11Protocol.java +++ b/java/org/apache/coyote/http11/AbstractHttp11Protocol.java @@ -17,7 +17,6 @@ package org.apache.coyote.http11; import org.apache.coyote.AbstractProtocolHandler; -import org.apache.tomcat.util.modeler.Registry; import org.apache.tomcat.util.res.StringManager; public abstract class AbstractHttp11Protocol extends AbstractProtocolHandler { @@ -195,9 +194,6 @@ public abstract class AbstractHttp11Protocol extends AbstractProtocolHandler { // ------------------------------------------------------- Lifecycle methods @Override - public abstract void init() throws Exception; - - @Override public void pause() throws Exception { try { endpoint.pause(); @@ -235,17 +231,4 @@ public abstract class AbstractHttp11Protocol extends AbstractProtocolHandler { if(getLog().isInfoEnabled()) getLog().info(sm.getString("http11protocol.stop", getName())); } - - @Override - public void destroy() throws Exception { - if(getLog().isInfoEnabled()) - getLog().info(sm.getString("http11protocol.destroy", getName())); - endpoint.destroy(); - if( tpOname!=null ) - Registry.getRegistry(null, null).unregisterComponent(tpOname); - if( rgOname != null ) - Registry.getRegistry(null, null).unregisterComponent(rgOname); - } - - } diff --git a/java/org/apache/coyote/http11/Http11AprProtocol.java b/java/org/apache/coyote/http11/Http11AprProtocol.java index 1c2e2c900..4e477f890 100644 --- a/java/org/apache/coyote/http11/Http11AprProtocol.java +++ b/java/org/apache/coyote/http11/Http11AprProtocol.java @@ -123,12 +123,6 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { log.info(sm.getString("http11protocol.start", getName())); } - @Override - public void destroy() throws Exception { - cHandler.recycledProcessors.clear(); - super.destroy(); - } - private Http11ConnectionHandler cHandler; public boolean getUseSendfile() { return ((AprEndpoint)endpoint).getUseSendfile(); } @@ -245,13 +239,10 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { protected Http11AprProtocol proto; protected AtomicLong registerCount = new AtomicLong(0); protected RequestGroupInfo global = new RequestGroupInfo(); - @Override - public RequestGroupInfo getGlobal() { - return global; - } protected ConcurrentHashMap, Http11AprProcessor> connections = new ConcurrentHashMap, Http11AprProcessor>(); + protected ConcurrentLinkedQueue recycledProcessors = new ConcurrentLinkedQueue() { private static final long serialVersionUID = 1L; @@ -298,6 +289,16 @@ public class Http11AprProtocol extends AbstractHttp11Protocol { } @Override + public RequestGroupInfo getGlobal() { + return global; + } + + @Override + public void recycle() { + recycledProcessors.clear(); + } + + @Override public SocketState event(SocketWrapper socket, SocketStatus status) { Http11AprProcessor processor = connections.get(socket); diff --git a/java/org/apache/coyote/http11/Http11NioProtocol.java b/java/org/apache/coyote/http11/Http11NioProtocol.java index bd9037255..92ea01562 100644 --- a/java/org/apache/coyote/http11/Http11NioProtocol.java +++ b/java/org/apache/coyote/http11/Http11NioProtocol.java @@ -207,13 +207,10 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol { protected Http11NioProtocol proto; protected static int count = 0; protected RequestGroupInfo global = new RequestGroupInfo(); - @Override - public RequestGroupInfo getGlobal() { - return global; - } protected ConcurrentHashMap connections = new ConcurrentHashMap(); + protected ConcurrentLinkedQueue recycledProcessors = new ConcurrentLinkedQueue() { private static final long serialVersionUID = 1L; protected AtomicInteger size = new AtomicInteger(0); @@ -258,7 +255,12 @@ public class Http11NioProtocol extends AbstractHttp11JsseProtocol { } @Override - public void releaseCaches() { + public RequestGroupInfo getGlobal() { + return global; + } + + @Override + public void recycle() { recycledProcessors.clear(); } diff --git a/java/org/apache/coyote/http11/Http11Protocol.java b/java/org/apache/coyote/http11/Http11Protocol.java index d19249f97..36ae00ec9 100644 --- a/java/org/apache/coyote/http11/Http11Protocol.java +++ b/java/org/apache/coyote/http11/Http11Protocol.java @@ -159,14 +159,8 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol { } - @Override - public void destroy() throws Exception { - cHandler.recycledProcessors.clear(); - super.destroy(); - } // ------------------------------------------------------------- Properties - /** * Name of the socket factory. */ @@ -191,10 +185,6 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol { protected Http11Protocol proto; protected AtomicLong registerCount = new AtomicLong(0); protected RequestGroupInfo global = new RequestGroupInfo(); - @Override - public RequestGroupInfo getGlobal() { - return global; - } protected ConcurrentHashMap, Http11Processor> connections = new ConcurrentHashMap, Http11Processor>(); @@ -244,6 +234,16 @@ public class Http11Protocol extends AbstractHttp11JsseProtocol { } @Override + public RequestGroupInfo getGlobal() { + return global; + } + + @Override + public void recycle() { + recycledProcessors.clear(); + } + + @Override public SocketState process(SocketWrapper socket) { return process(socket,SocketStatus.OPEN); } diff --git a/java/org/apache/tomcat/util/net/AbstractEndpoint.java b/java/org/apache/tomcat/util/net/AbstractEndpoint.java index 1dc6f6ec3..070ae7dc1 100644 --- a/java/org/apache/tomcat/util/net/AbstractEndpoint.java +++ b/java/org/apache/tomcat/util/net/AbstractEndpoint.java @@ -76,7 +76,7 @@ public abstract class AbstractEndpoint { public static interface Handler { /** - * Different types of socket states to react upon + * Different types of socket states to react upon. */ public enum SocketState { OPEN, CLOSED, LONG, ASYNC_END @@ -84,9 +84,15 @@ public abstract class AbstractEndpoint { /** - * Obtain the GlobalRequestProcessor associated with the handler + * Obtain the GlobalRequestProcessor associated with the handler. */ public RequestGroupInfo getGlobal(); + + + /** + * Recycle resources associated with the handler. + */ + public void recycle(); } // Standard SSL Configuration attributes diff --git a/java/org/apache/tomcat/util/net/AprEndpoint.java b/java/org/apache/tomcat/util/net/AprEndpoint.java index 1fda4e758..994cc886b 100644 --- a/java/org/apache/tomcat/util/net/AprEndpoint.java +++ b/java/org/apache/tomcat/util/net/AprEndpoint.java @@ -690,6 +690,8 @@ public class AprEndpoint extends AbstractEndpoint { rootPool = 0; } + handler.recycle(); + initialized = false; } diff --git a/java/org/apache/tomcat/util/net/JIoEndpoint.java b/java/org/apache/tomcat/util/net/JIoEndpoint.java index c49719f1c..24c5e181f 100644 --- a/java/org/apache/tomcat/util/net/JIoEndpoint.java +++ b/java/org/apache/tomcat/util/net/JIoEndpoint.java @@ -466,6 +466,7 @@ public class JIoEndpoint extends AbstractEndpoint { } serverSocket = null; } + handler.recycle(); initialized = false ; } diff --git a/java/org/apache/tomcat/util/net/NioEndpoint.java b/java/org/apache/tomcat/util/net/NioEndpoint.java index de91ba160..5c9a3a769 100644 --- a/java/org/apache/tomcat/util/net/NioEndpoint.java +++ b/java/org/apache/tomcat/util/net/NioEndpoint.java @@ -427,7 +427,7 @@ public class NioEndpoint extends AbstractEndpoint { this.keyCache.clear(); this.nioChannels.clear(); this.processorCache.clear(); - if ( handler != null ) handler.releaseCaches(); + if ( handler != null ) handler.recycle(); } @@ -1478,7 +1478,6 @@ public class NioEndpoint extends AbstractEndpoint { public interface Handler extends AbstractEndpoint.Handler { public SocketState process(NioChannel socket); public SocketState event(NioChannel socket, SocketStatus status); - public void releaseCaches(); public void release(NioChannel socket); public void release(SocketChannel socket); } -- 2.11.0