Author: markt Date: Fri May 22 16:41:15 2009 New Revision: 777611 URL: http://svn.apache.org/viewvc?rev=777611&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=47046 Deregister all MBeans when the server is stopped
Modified: tomcat/tc6.0.x/trunk/ (props changed) tomcat/tc6.0.x/trunk/STATUS.txt tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Propchange: tomcat/tc6.0.x/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri May 22 16:41:15 2009 @@ -1 +1 @@ -/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,673796,673820,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757335,757774,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335 +/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,673796,673820,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757335,757774,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979 Modified: tomcat/tc6.0.x/trunk/STATUS.txt URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=777611&r1=777610&r2=777611&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/STATUS.txt (original) +++ tomcat/tc6.0.x/trunk/STATUS.txt Fri May 22 16:41:15 2009 @@ -115,24 +115,6 @@ +0: kkolinko: should not be needed, as old and new are both correct. -1: -* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=47046 - Deregister all MBeans when the server is stopped - http://svn.apache.org/viewvc?rev=769979&view=rev - +1: markt, pero - +1: kkolinko (ok, but one question: - in MBeanUtils.java: - - @@ -1401,12 +1417,7 @@ - static void destroyMBean(Context context) - .. - + String domain = context.getParent().getParent().getName(); - if (domain == null) - domain = mserver.getDefaultDomain(); - - Can domain be null here, or one of those getParent().foo() calls result in an NPE ? - ) - -1: - * Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=47080 Prevent NPE when mapper makes no matches http://svn.apache.org/viewvc?rev=770809&view=rev Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java?rev=777611&r1=777610&r2=777611&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java Fri May 22 16:41:15 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/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java?rev=777611&r1=777610&r2=777611&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java Fri May 22 16:41:15 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,33 +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"); - Service service = connector.getService(); - String serviceName = null; - if (service != null) - serviceName = service.getName(); - 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); } - } @@ -1406,13 +1403,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); @@ -1420,6 +1412,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); + } } @@ -1434,12 +1446,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); @@ -1486,6 +1493,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) { @@ -1536,13 +1549,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); @@ -1589,12 +1596,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); @@ -1676,7 +1678,7 @@ if (domain == null) domain = mserver.getDefaultDomain(); ObjectName oname = createObjectName(domain, resources); - if( mserver.isRegistered(oname) ) + if( mserver.isRegistered(oname) ) mserver.unregisterMBean(oname); } @@ -1756,6 +1758,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); } @@ -1839,6 +1851,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/tc6.0.x/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java?rev=777611&r1=777610&r2=777611&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java Fri May 22 16:41:15 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); @@ -640,10 +640,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); } @@ -676,10 +672,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); } @@ -727,7 +723,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); @@ -865,7 +861,7 @@ if (log.isDebugEnabled()) { log.debug("Destroying MBean for Engine " + engine); } - //MBeanUtils.destroyMBean(engine); + MBeanUtils.destroyMBean(engine); } @@ -902,7 +898,7 @@ if (log.isDebugEnabled()) { log.debug("Destroying MBean for Host " + host); } - //MBeanUtils.destroyMBean(host); + MBeanUtils.destroyMBean(host); } @@ -979,7 +975,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); } @@ -1000,20 +996,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); } Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=777611&r1=777610&r2=777611&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Fri May 22 16:41:15 2009 @@ -47,6 +47,10 @@ <bug>46967</bug>: Better handling of errors when trying to use Manager.randomFile. Based on a patch by Kirk Wolf. (markt) </fix> + <fix> + <bug>47046</bug>: Unregister all MBeans, including when non-default + engine names are used. (markt) + </fix> </changelog> </subsection> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org