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 2009/04/30 00:47:53 UTC

svn commit: r769979 - in /tomcat/trunk/java/org/apache/catalina: connector/MapperListener.java mbeans/MBeanUtils.java mbeans/ServerLifecycleListener.java

Author: markt
Date: Wed Apr 29 22:47:53 2009
New Revision: 769979

URL: http://svn.apache.org/viewvc?rev=769979&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=47046
Unregister all MBeans, including when non-default engine names are used (which changes the domain of some of the MBeans)

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java
    tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java
    tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java?rev=769979&r1=769978&r2=769979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java Wed Apr 29 22:47:53 2009
@@ -353,7 +353,9 @@
                 domain).getContainer().findChild(name);
         
             mapper.removeHost(name);
-            host.removeContainerListener(this);
+            if (host != null) {
+                host.removeContainerListener(this);
+            }
             if(log.isDebugEnabled())
                 log.debug(sm.getString
                         ("mapperListener.unregisterHost", name, domain));

Modified: tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java?rev=769979&r1=769978&r2=769979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java (original)
+++ tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java Wed Apr 29 22:47:53 2009
@@ -19,6 +19,7 @@
 
 
 import java.util.Hashtable;
+import java.util.Set;
 
 import javax.management.DynamicMBean;
 import javax.management.MBeanException;
@@ -47,6 +48,12 @@
 import org.apache.catalina.deploy.ContextResourceLink;
 import org.apache.catalina.deploy.NamingResources;
 import org.apache.catalina.valves.ValveBase;
+import org.apache.coyote.ProtocolHandler;
+import org.apache.coyote.ajp.AjpAprProtocol;
+import org.apache.coyote.ajp.AjpProtocol;
+import org.apache.coyote.http11.Http11AprProtocol;
+import org.apache.coyote.http11.Http11NioProtocol;
+import org.apache.coyote.http11.Http11Protocol;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.IntrospectionUtils;
@@ -734,29 +741,23 @@
         throws MalformedObjectNameException {
 
         ObjectName name = null;
-        if (connector.getClass().getName().indexOf("CoyoteConnector") >= 0 ) {
-            try {
-                String address = (String)
-                    IntrospectionUtils.getProperty(connector, "address");
-                Integer port = (Integer)
-                    IntrospectionUtils.getProperty(connector, "port");
-                StringBuffer sb = new StringBuffer(domain);
-                sb.append(":type=Connector");
-                sb.append(",port=" + port);
-                if ((address != null) && (address.length()>0)) {
-                    sb.append(",address=" + address);
-                }
-                name = new ObjectName(sb.toString());
-                return (name);
-            } catch (Exception e) {
-                throw new MalformedObjectNameException
-                    ("Cannot create object name for " + connector+e);
+        try {
+            String address = (String)
+                IntrospectionUtils.getProperty(connector, "address");
+            Integer port = (Integer)
+                IntrospectionUtils.getProperty(connector, "port");
+            StringBuffer sb = new StringBuffer(domain);
+            sb.append(":type=Connector");
+            sb.append(",port=" + port);
+            if ((address != null) && (address.length()>0)) {
+                sb.append(",address=" + address);
             }
-        } else {
+            name = new ObjectName(sb.toString());
+            return (name);
+        } catch (Exception e) {
             throw new MalformedObjectNameException
-                ("Cannot create object name for " + connector);
+                ("Cannot create object name for " + connector+e);
         }
-
     }
 
 
@@ -1373,13 +1374,8 @@
     static void destroyMBean(Connector connector, Service service)
         throws Exception {
 
-        connector.setService(service);
-        String mname = createManagedName(connector);
-        ManagedBean managed = registry.findManagedBean(mname);
-        if (managed == null) {
-            return;
-        }
-        String domain = managed.getDomain();
+        // domain is engine name
+        String domain = service.getContainer().getName();
         if (domain == null)
             domain = mserver.getDefaultDomain();
         ObjectName oname = createObjectName(domain, connector);
@@ -1387,6 +1383,26 @@
         if( mserver.isRegistered( oname ))  {
             mserver.unregisterMBean(oname);
         }
+        // Unregister associated request processor
+        String worker = null;
+        ProtocolHandler handler = connector.getProtocolHandler();
+        if (handler instanceof Http11Protocol) {
+            worker = ((Http11Protocol)handler).getName();
+        } else if (handler instanceof Http11NioProtocol) {
+            worker = ((Http11NioProtocol)handler).getName();
+        } else if (handler instanceof Http11AprProtocol) {
+            worker = ((Http11AprProtocol)handler).getName();
+        } else if (handler instanceof AjpProtocol) {
+            worker = ((AjpProtocol)handler).getName();
+        } else if (handler instanceof AjpAprProtocol) {
+            worker = ((AjpAprProtocol)handler).getName();
+        }
+        ObjectName query = new ObjectName(
+                domain + ":type=RequestProcessor,worker=" + worker + ",*");
+        Set<ObjectName> results = mserver.queryNames(query, null);
+        for(ObjectName result : results) {
+            mserver.unregisterMBean(result);
+        }
     }
 
 
@@ -1401,12 +1417,7 @@
     static void destroyMBean(Context context)
         throws Exception {
 
-        String mname = createManagedName(context);
-        ManagedBean managed = registry.findManagedBean(mname);
-        if (managed == null) {
-            return;
-        }
-        String domain = managed.getDomain();
+        String domain = context.getParent().getParent().getName();
         if (domain == null)
             domain = mserver.getDefaultDomain();
         ObjectName oname = createObjectName(domain, context);
@@ -1453,6 +1464,12 @@
     static void destroyMBean(ContextResource resource)
         throws Exception {
 
+        // If this is a user database resource need to destroy groups, roles,
+        // users and UserDatabase mbean
+        if ("org.apache.catalina.UserDatabase".equals(resource.getType())) {
+            destroyMBeanUserDatabase(resource.getName());
+        }
+
         String mname = createManagedName(resource);
         ManagedBean managed = registry.findManagedBean(mname);
         if (managed == null) {
@@ -1503,13 +1520,7 @@
      */
     static void destroyMBean(Engine engine)
         throws Exception {
-
-        String mname = createManagedName(engine);
-        ManagedBean managed = registry.findManagedBean(mname);
-        if (managed == null) {
-            return;
-        }
-        String domain = managed.getDomain();
+        String domain = engine.getName();
         if (domain == null)
             domain = mserver.getDefaultDomain();
         ObjectName oname = createObjectName(domain, engine);
@@ -1556,12 +1567,7 @@
     static void destroyMBean(Host host)
         throws Exception {
 
-        String mname = createManagedName(host);
-        ManagedBean managed = registry.findManagedBean(mname);
-        if (managed == null) {
-            return;
-        }
-        String domain = managed.getDomain();
+        String domain = host.getParent().getName();
         if (domain == null)
             domain = mserver.getDefaultDomain();
         ObjectName oname = createObjectName(domain, host);
@@ -1643,7 +1649,7 @@
         if (domain == null)
             domain = mserver.getDefaultDomain();
         ObjectName oname = createObjectName(domain, resources);
-       if( mserver.isRegistered(oname) )
+        if( mserver.isRegistered(oname) )
             mserver.unregisterMBean(oname);
 
     }
@@ -1723,6 +1729,16 @@
         ObjectName oname = createObjectName(domain, server);
         if( mserver.isRegistered(oname) )
             mserver.unregisterMBean(oname);
+        
+        // Global String cache - fixed name
+        oname = new ObjectName("Catalina:type=StringCache");
+        if( mserver.isRegistered(oname) )
+            mserver.unregisterMBean(oname);
+
+        // MBean Factory - fixed name
+        oname = new ObjectName("Catalina:type=MBeanFactory");
+        if( mserver.isRegistered(oname) )
+            mserver.unregisterMBean(oname);
 
     }
 
@@ -1806,6 +1822,51 @@
 
 
     /**
+     * Deregister the MBean for the
+     * <code>UserDatabase</code> object with this name.
+     *
+     * @param userDatabase The UserDatabase to be managed
+     *
+     * @exception Exception if an MBean cannot be deregistered
+     */
+    static void destroyMBeanUserDatabase(String userDatabase)
+        throws Exception {
+
+        ObjectName query = null;
+        Set<ObjectName> results = null;
+        
+        // Groups
+        query = new ObjectName(
+                "Users:type=Group,database=" + userDatabase + ",*");
+        results = mserver.queryNames(query, null);
+        for(ObjectName result : results) {
+            mserver.unregisterMBean(result);
+        }
+        
+        // Roles
+        query = new ObjectName(
+                "Users:type=Role,database=" + userDatabase + ",*");
+        results = mserver.queryNames(query, null);
+        for(ObjectName result : results) {
+            mserver.unregisterMBean(result);
+        }
+        
+        // Users
+        query = new ObjectName(
+                "Users:type=User,database=" + userDatabase + ",*");
+        results = mserver.queryNames(query, null);
+        for(ObjectName result : results) {
+            mserver.unregisterMBean(result);
+        }
+
+        // The database itself
+        ObjectName db = new ObjectName(
+                "Users:type=UserDatabase,database=" + userDatabase);
+        mserver.unregisterMBean(db);
+    }
+
+
+    /**
      * Deregister the MBean for this
      * <code>Valve</code> object.
      *

Modified: tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java?rev=769979&r1=769978&r2=769979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java (original)
+++ tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java Wed Apr 29 22:47:53 2009
@@ -148,7 +148,7 @@
             createMBeans();
             */
 
-        } else if (Lifecycle.STOP_EVENT.equals(event.getType())) {
+        } else if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) {
             try {
                 if (lifecycle instanceof Server) {
                     destroyMBeans((Server)lifecycle);
@@ -590,10 +590,6 @@
      */
     protected void createMBeans(Service service) throws Exception {
 
-        // Create the MBean for the Service itself
-        if (log.isDebugEnabled())
-            log.debug("Creating MBean for Service " + service);
-        //MBeanUtils.createMBean(service);
         if (service instanceof StandardService) {
             ((StandardService) service).addPropertyChangeListener(this);
         }
@@ -626,10 +622,10 @@
     protected void destroyMBeans(Connector connector, Service service)
         throws Exception {
 
-//        // deregister the MBean for the Connector itself
-//        if (log.isDebugEnabled())
-//            log.debug("Destroying MBean for Connector " + connector);
-//        MBeanUtils.destroyMBean(connector, service);
+        // deregister the MBean for the Connector itself
+        if (log.isDebugEnabled())
+            log.debug("Destroying MBean for Connector " + connector);
+        MBeanUtils.destroyMBean(connector, service);
 
     }
 
@@ -677,7 +673,7 @@
         // deregister the MBean for the Context itself
         if (log.isDebugEnabled())
             log.debug("Destroying MBean for Context " + context);
-        //MBeanUtils.destroyMBean(context);
+        MBeanUtils.destroyMBean(context);
         if (context instanceof StandardContext) {
             ((StandardContext) context).
                 removePropertyChangeListener(this);
@@ -774,7 +770,7 @@
         if (log.isDebugEnabled()) {
             log.debug("Destroying MBean for Engine " + engine);
         }
-        //MBeanUtils.destroyMBean(engine);
+        MBeanUtils.destroyMBean(engine);
 
     }
 
@@ -811,7 +807,7 @@
         if (log.isDebugEnabled()) {
             log.debug("Destroying MBean for Host " + host);
         }
-        //MBeanUtils.destroyMBean(host);
+        MBeanUtils.destroyMBean(host);
 
     }
 
@@ -880,7 +876,7 @@
         if (log.isDebugEnabled()) {
             log.debug("Destroying MBean for Server " + server);
         }
-        //MBeanUtils.destroyMBean(server);
+        MBeanUtils.destroyMBean(server);
         if (server instanceof StandardServer) {
             ((StandardServer) server).removePropertyChangeListener(this);
         }
@@ -901,20 +897,15 @@
         // Deregister the MBeans for the associated Engine
         Engine engine = (Engine) service.getContainer();
         if (engine != null) {
-            //destroyMBeans(engine);
+            destroyMBeans(engine);
         }
 
-//        // Deregister the MBeans for the corresponding Connectors
-//        Connector connectors[] = service.findConnectors();
-//        for (int j = 0; j < connectors.length; j++) {
-//            destroyMBeans(connectors[j], service);
-//        }
-
-        // Deregister the MBean for the Service itself
-        if (log.isDebugEnabled()) {
-            log.debug("Destroying MBean for Service " + service);
+        // Deregister the MBeans for the corresponding Connectors
+        Connector connectors[] = service.findConnectors();
+        for (int j = 0; j < connectors.length; j++) {
+            destroyMBeans(connectors[j], service);
         }
-        //MBeanUtils.destroyMBean(service);
+
         if (service instanceof StandardService) {
             ((StandardService) service).removePropertyChangeListener(this);
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org