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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org