Author: macbean
Date: Wed Oct 29 12:31:26 2014
New Revision: 1635114

URL: http://svn.apache.org/r1635114
Log:
QPID-6194: [Java Broker] Add option to prevent Broker startup when it has 
ERRORED children

Modified:
    
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
    
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
    
qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/BrokerStartupTest.java

Modified: 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java?rev=1635114&r1=1635113&r2=1635114&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
 Wed Oct 29 12:31:26 2014
@@ -58,6 +58,7 @@ public interface Broker<X extends Broker
     String CONNECTION_CLOSE_WHEN_NO_ROUTE = "connection.closeWhenNoRoute";
 
     String BROKER_FLOW_TO_DISK_THRESHOLD = "broker.flowToDiskThreshold";
+    String BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD = 
"broker.failStartupWithErroredChild";
 
     String QPID_AMQP_PORT = "qpid.amqp_port";
     String QPID_HTTP_PORT = "qpid.http_port";
@@ -86,6 +87,8 @@ public interface Broker<X extends Broker
     @ManagedContextDefault(name = BROKER_FRAME_SIZE)
     int DEFAULT_FRAME_SIZE = 65535;
 
+    @ManagedContextDefault(name = BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD)
+    boolean DEFAULT_BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD = false;
 
     @DerivedAttribute
     String getBuildVersion();

Modified: 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java?rev=1635114&r1=1635113&r2=1635114&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
 Wed Oct 29 12:31:26 2014
@@ -235,41 +235,42 @@ public class BrokerAdapter extends Abstr
             _managementModeAuthenticationProvider.open();
         }
 
-        for(KeyStore<?> keyStore : getChildren(KeyStore.class))
-        {
-            addKeyStore(keyStore);
-        }
-        for(TrustStore<?> trustStore : getChildren(TrustStore.class))
-        {
-            addTrustStore(trustStore);
-        }
-        for(AuthenticationProvider<?> authenticationProvider : 
getChildren(AuthenticationProvider.class))
-        {
-            addAuthenticationProvider(authenticationProvider);
-        }
-        for(Port<?> port : getChildren(Port.class))
-        {
-            addPort(port);
-        }
-        for(Plugin<?> plugin : getChildren(Plugin.class))
-        {
-            addPlugin(plugin);
-        }
-        for(GroupProvider<?> groupProvider : getChildren(GroupProvider.class))
-        {
-            addGroupProvider(groupProvider);
-        }
-        for(AccessControlProvider<?> accessControlProvider : 
getChildren(AccessControlProvider.class))
+        boolean hasBrokerAnyErroredChildren = false;
+
+        for (final Class<? extends ConfiguredObject> childClass : 
getModel().getChildTypes(getCategoryClass()))
         {
-            addAccessControlProvider(accessControlProvider);
+            final Collection<? extends ConfiguredObject> children = 
getChildren(childClass);
+            if (children != null) {
+                for (final ConfiguredObject<?> child : children) {
+
+                    if (child instanceof  AccessControlProvider)
+                    {
+                        addAccessControlProvider((AccessControlProvider)child);
+                    }
+                    else
+                    {
+                        child.addChangeListener(this);
+                    }
+
+                    if (child.getState() == State.ERRORED )
+                    {
+                        hasBrokerAnyErroredChildren = true;
+                        LOGGER.warn(String.format("Broker child object '%s' of 
type '%s' is %s",
+                                                    child.getName(), 
childClass.getSimpleName(), State.ERRORED ));
+                    }
+                }
+            }
         }
-        for(VirtualHostNode<?> virtualHostNode : 
getChildren(VirtualHostNode.class))
+
+        final boolean brokerShutdownOnErroredChild = 
getContextValue(Boolean.class, BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD);
+        if (!_brokerOptions.isManagementMode() && brokerShutdownOnErroredChild 
&& hasBrokerAnyErroredChildren)
         {
-            addVirtualHostNode(virtualHostNode);
+            throw new IllegalStateException(String.format("Broker context 
variable %s is set and the broker has %s children",
+                    BROKER_FAIL_STARTUP_WITH_ERRORED_CHILD, State.ERRORED));
         }
 
         initialiseStatisticsReporting();
-       // changeChildState(State.ACTIVE, false);
+
         if (isManagementMode())
         {
             
_eventLogger.message(BrokerMessages.MANAGEMENT_MODE(BrokerOptions.MANAGEMENT_MODE_USER_NAME,

Modified: 
qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/BrokerStartupTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/BrokerStartupTest.java?rev=1635114&r1=1635113&r2=1635114&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/BrokerStartupTest.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/test/java/org/apache/qpid/server/BrokerStartupTest.java
 Wed Oct 29 12:31:26 2014
@@ -24,6 +24,7 @@ import java.io.File;
 import java.util.List;
 
 import javax.jms.Connection;
+import javax.jms.JMSException;
 import javax.jms.Queue;
 import javax.jms.Session;
 
@@ -183,4 +184,50 @@ public class BrokerStartupTest extends A
         }
     }
 
+    public void testStartupWithErroredChildrenCanBeConfigured() throws 
Exception
+    {
+        if (isJavaBroker())
+        {
+            int port = getPort(0);
+            int managementPort = getManagementPort(port);
+            int connectorServerPort = managementPort + 
JMXPORT_CONNECTORSERVER_OFFSET;
+
+            setTestSystemProperty("qpid.amqp_port",String.valueOf(port));
+            
setTestSystemProperty("qpid.jmx_port",String.valueOf(managementPort));
+            
setTestSystemProperty("qpid.rmi_port",String.valueOf(connectorServerPort));
+
+            //Purposely set the HTTP port to be the same as the AMQP port so 
that the port object becomes ERRORED
+            setTestSystemProperty("qpid.http_port",String.valueOf(port));
+
+            // Set broker to fail on startup if it has ERRORED children
+            setTestSystemProperty("broker.failStartupWithErroredChild", 
String.valueOf(Boolean.TRUE));
+
+            File brokerConfigFile = new File(getTestConfigFile(port));
+            if (brokerConfigFile.exists())
+            {
+                // Config exists from previous test run, delete it.
+                brokerConfigFile.delete();
+            }
+
+            startBroker(port, null);
+
+            AMQConnectionURL url = new AMQConnectionURL(String.format("amqp://"
+                    + GUEST_USERNAME
+                    + ":"
+                    + GUEST_PASSWORD
+                    + "@clientid/?brokerlist='localhost:%d'", port));
+
+            try
+            {
+                Connection conn = getConnection(url);
+                fail("Connection should fail as broker startup should have 
failed due to ERRORED children (port)");
+                conn.close();
+            }
+            catch (JMSException jmse)
+            {
+                //pass
+            }
+        }
+    }
+
 }



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

Reply via email to