Author: orudyy
Date: Mon Jun  9 08:35:09 2014
New Revision: 1601322

URL: http://svn.apache.org/r1601322
Log:
QPID-5715: Unregister children MBeans on Virtual Host Node stop

Modified:
    
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
    
qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
    
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.java

Modified: 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java?rev=1601322&r1=1601321&r2=1601322&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
 Mon Jun  9 08:35:09 2014
@@ -205,8 +205,8 @@ public abstract class AbstractVirtualHos
     @StateTransition( currentState = { State.ACTIVE, State.ERRORED, 
State.UNINITIALIZED }, desiredState = State.STOPPED )
     protected void doStop()
     {
-        closeConfigurationStore();
         closeChildren();
+        closeConfigurationStore();
         _state.set(State.STOPPED);
     }
 

Modified: 
qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java?rev=1601322&r1=1601321&r2=1601322&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
 Mon Jun  9 08:35:09 2014
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
@@ -269,7 +270,8 @@ public class JMXManagementPluginImpl
 
             if(LOGGER.isDebugEnabled())
             {
-                LOGGER.debug("Provider " + provider + " mBean for child " + 
child + " " + mBean);
+                LOGGER.debug("Provider " + provider + (mBean == null ? " did 
not create mBean" : " created mBean " + mBean)
+                        + " for child " + child);
             }
         }
     }
@@ -377,18 +379,37 @@ public class JMXManagementPluginImpl
         return mbeans.containsKey(mBeanProvider);
     }
 
-    private void destroyObjectMBeans(ConfiguredObject<?> child, boolean 
removeListener)
+    private void destroyObjectMBeans(ConfiguredObject<?> object, boolean 
removeListener)
     {
-        if (supportedConfiguredObject(child))
+        if (supportedConfiguredObject(object))
         {
             synchronized (_childrenLock)
             {
                 if (removeListener)
                 {
-                    child.removeChangeListener(_changeListener);
+                    object.removeChangeListener(_changeListener);
+                }
+                unregisterObjectMBeans(object);
+                _children.remove(object);
+                destroyChildrenMBeansIfVirtualHostNode(object);
+            }
+        }
+    }
+
+    private void destroyChildrenMBeansIfVirtualHostNode(ConfiguredObject<?> 
child)
+    {
+        if (child instanceof VirtualHostNode)
+        {
+            for (Iterator<ConfiguredObject<?>> iterator = 
_children.keySet().iterator(); iterator.hasNext();)
+            {
+                ConfiguredObject<?> registeredObject = iterator.next();
+                ConfiguredObject<?> parent = 
registeredObject.getParent(VirtualHostNode.class);
+                if (parent == child)
+                {
+                    registeredObject.removeChangeListener(_changeListener);
+                    unregisterObjectMBeans(registeredObject);
                 }
-                unregisterObjectMBeans(child);
-                _children.remove(child);
+                iterator.remove();
             }
         }
     }
@@ -429,6 +450,12 @@ public class JMXManagementPluginImpl
         {
             return "INTERNAL";
         }
+
+        @Override
+        public String toString()
+        {
+            return DEFAULT_NAME;
+        }
     }
 
     private class ChangeListener implements ConfigurationChangeListener
@@ -465,7 +492,14 @@ public class JMXManagementPluginImpl
             // for instance, on role change in BDB HA VHN a VH could is 
recovered/created.
             // A call to createObjectMBeans is safe as it checks the existence 
of MBean before its creation.
 
-            createObjectMBeans(object);
+            if (ConfiguredObject.DESIRED_STATE.equals(attributeName))
+            {
+                stateChanged(object, 
State.valueOf(String.valueOf(oldAttributeValue)), 
State.valueOf(String.valueOf(newAttributeValue)));
+            }
+            else
+            {
+                createObjectMBeans(object);
+            }
         }
     }
 

Modified: 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.java?rev=1601322&r1=1601321&r2=1601322&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.java
 Mon Jun  9 08:35:09 2014
@@ -33,6 +33,7 @@ import org.apache.qpid.server.model.Auth
 import org.apache.qpid.server.model.Plugin;
 import org.apache.qpid.server.model.Port;
 import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.VirtualHostNode;
 import 
org.apache.qpid.server.security.auth.manager.AnonymousAuthenticationManager;
 import org.apache.qpid.server.virtualhost.ProvidedStoreVirtualHost;
@@ -43,7 +44,8 @@ import org.apache.qpid.test.utils.TestBr
 
 public class MBeanLifeCycleTest extends QpidRestTestCase
 {
-
+    private final static String TEST_VIRTUAL_HOST_MBEAN_SEARCH_QUERY = 
"org.apache.qpid:type=VirtualHost.VirtualHostManager,VirtualHost="
+            + ObjectName.quote(TEST2_VIRTUALHOST);
     private JMXTestUtils _jmxUtils;
 
     @Override
@@ -108,14 +110,31 @@ public class MBeanLifeCycleTest extends 
 
     public void testVirtualHostMBeanIsUnregisteredOnVirtualHostDeletion() 
throws Exception
     {
-        String query = 
"org.apache.qpid:type=VirtualHost.VirtualHostManager,VirtualHost="
-                + ObjectName.quote(TEST2_VIRTUALHOST)  + ",*";
-        boolean mBeanExists =_jmxUtils.doesManagedObjectExist(query);
+        boolean mBeanExists 
=_jmxUtils.doesManagedObjectExist(TEST_VIRTUAL_HOST_MBEAN_SEARCH_QUERY);
         assertTrue("Host mBean is not registered", mBeanExists);
 
         getRestTestHelper().submitRequest("virtualhostnode/" + 
TEST2_VIRTUALHOST, "DELETE", HttpServletResponse.SC_OK);
 
-        mBeanExists =_jmxUtils.doesManagedObjectExist(query);
+        mBeanExists 
=_jmxUtils.doesManagedObjectExist(TEST_VIRTUAL_HOST_MBEAN_SEARCH_QUERY);
+        assertFalse("Host mBean is not unregistered", mBeanExists);
+    }
+
+    public void testVirtualHostMBeanIsUnregisteredOnVirtualHostNodeStop() 
throws Exception
+    {
+        boolean mBeanExists 
=_jmxUtils.doesManagedObjectExist(TEST_VIRTUAL_HOST_MBEAN_SEARCH_QUERY);
+        assertTrue("Host mBean is not registered", mBeanExists);
+
+        ManagedBroker managedBroker = 
_jmxUtils.getManagedBroker(TEST2_VIRTUALHOST);
+        assertNotNull("Host mBean is not created", managedBroker);
+
+        Map<String, Object> nodeData = new HashMap<String, Object>();
+        nodeData.put(VirtualHostNode.NAME, TEST2_VIRTUALHOST);
+        nodeData.put(VirtualHostNode.DESIRED_STATE, State.STOPPED.name());
+
+        int status = getRestTestHelper().submitRequest("virtualhostnode/" + 
TEST2_VIRTUALHOST, "PUT", nodeData);
+        assertEquals("Unexpected code", 200, status);
+
+        mBeanExists 
=_jmxUtils.doesManagedObjectExist(TEST_VIRTUAL_HOST_MBEAN_SEARCH_QUERY);
         assertFalse("Host mBean is not unregistered", mBeanExists);
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to