Search in sources :

Example 11 with AbstractConfigurationChangeListener

use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.

the class BDBHAVirtualHostNodeTest method testNodeCannotStartWithIntruder.

public void testNodeCannotStartWithIntruder() throws Exception {
    int nodePortNumber = _portHelper.getNextAvailable();
    int intruderPortNumber = _portHelper.getNextAvailable();
    String helperAddress = "localhost:" + nodePortNumber;
    String groupName = "group";
    String nodeName = "node";
    Map<String, Object> node1Attributes = _helper.createNodeAttributes(nodeName, groupName, helperAddress, helperAddress, nodeName, nodePortNumber);
    BDBHAVirtualHostNode<?> node = _helper.createAndStartHaVHN(node1Attributes);
    final CountDownLatch stopLatch = new CountDownLatch(1);
    ConfigurationChangeListener listener = new AbstractConfigurationChangeListener() {

        @Override
        public void stateChanged(ConfiguredObject<?> object, State oldState, State newState) {
            if (newState == State.ERRORED) {
                stopLatch.countDown();
            }
        }
    };
    node.addChangeListener(listener);
    File environmentPathFile = new File(_helper.getMessageStorePath() + File.separator + "intruder");
    Durability durability = Durability.parse((String) node1Attributes.get(BDBHAVirtualHostNode.DURABILITY));
    joinIntruder(intruderPortNumber, "intruder", groupName, helperAddress, durability, environmentPathFile);
    assertTrue("Intruder protection was not triggered during expected timeout", stopLatch.await(10, TimeUnit.SECONDS));
    final CountDownLatch stateChangeLatch = new CountDownLatch(1);
    final CountDownLatch roleChangeLatch = new CountDownLatch(1);
    node.addChangeListener(new AbstractConfigurationChangeListener() {

        @Override
        public void stateChanged(final ConfiguredObject<?> object, final State oldState, final State newState) {
            if (newState == State.ERRORED) {
                stateChangeLatch.countDown();
            }
        }

        @Override
        public void attributeSet(final ConfiguredObject<?> object, final String attributeName, final Object oldAttributeValue, final Object newAttributeValue) {
            if (BDBHAVirtualHostNode.ROLE.equals(attributeName) && NodeRole.DETACHED.equals(NodeRole.DETACHED)) {
                roleChangeLatch.countDown();
            }
        }
    });
    // Try top re start the ERRORED node and ensure exception is thrown
    try {
        node.start();
        fail("Restart of node should have thrown exception");
    } catch (IllegalStateException ise) {
        assertEquals("Unexpected exception when restarting node post intruder detection", "Intruder node detected: " + "localhost:" + intruderPortNumber, ise.getMessage());
    }
    // verify that intruder detection is triggered after restart and environment is closed
    assertTrue("Node state was not set to ERRORED", stateChangeLatch.await(10, TimeUnit.SECONDS));
    assertTrue("Node role was not set to DETACHED", roleChangeLatch.await(10, TimeUnit.SECONDS));
}
Also used : Durability(com.sleepycat.je.Durability) CountDownLatch(java.util.concurrent.CountDownLatch) AbstractConfigurationChangeListener(org.apache.qpid.server.model.AbstractConfigurationChangeListener) ConfigurationChangeListener(org.apache.qpid.server.model.ConfigurationChangeListener) AbstractConfigurationChangeListener(org.apache.qpid.server.model.AbstractConfigurationChangeListener) State(org.apache.qpid.server.model.State) ConfiguredObject(org.apache.qpid.server.model.ConfiguredObject) ConfiguredObject(org.apache.qpid.server.model.ConfiguredObject) File(java.io.File)

Example 12 with AbstractConfigurationChangeListener

use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.

the class BDBHAVirtualHostNodeTest method testPermittedNodesChangedOnReplicaNodeOnlyOnceAfterBeingChangedOnMaster.

public void testPermittedNodesChangedOnReplicaNodeOnlyOnceAfterBeingChangedOnMaster() throws Exception {
    int node1PortNumber = _portHelper.getNextAvailable();
    int node2PortNumber = _portHelper.getNextAvailable();
    String helperAddress = "localhost:" + node1PortNumber;
    String groupName = "group";
    String nodeName = "node1";
    Map<String, Object> node1Attributes = _helper.createNodeAttributes(nodeName, groupName, helperAddress, helperAddress, nodeName, node1PortNumber, node2PortNumber);
    BDBHAVirtualHostNode<?> node1 = _helper.createAndStartHaVHN(node1Attributes);
    Map<String, Object> node2Attributes = _helper.createNodeAttributes("node2", groupName, "localhost:" + node2PortNumber, helperAddress, nodeName);
    node2Attributes.put(BDBHAVirtualHostNode.PRIORITY, 0);
    BDBHAVirtualHostNode<?> node2 = _helper.createAndStartHaVHN(node2Attributes);
    assertEquals("Unexpected role", NodeRole.REPLICA, node2.getRole());
    _helper.awaitRemoteNodes(node2, 1);
    BDBHARemoteReplicationNode<?> remote = _helper.findRemoteNode(node2, node1.getName());
    final AtomicInteger permittedNodesChangeCounter = new AtomicInteger();
    final CountDownLatch _permittedNodesLatch = new CountDownLatch(1);
    node2.addChangeListener(new AbstractConfigurationChangeListener() {

        @Override
        public void attributeSet(ConfiguredObject<?> object, String attributeName, Object oldAttributeValue, Object newAttributeValue) {
            if (attributeName.equals(BDBHAVirtualHostNode.PERMITTED_NODES)) {
                permittedNodesChangeCounter.incrementAndGet();
                _permittedNodesLatch.countDown();
            }
        }
    });
    List<String> permittedNodes = new ArrayList<>(node1.getPermittedNodes());
    permittedNodes.add("localhost:5000");
    node1.setAttributes(Collections.<String, Object>singletonMap(BDBHAVirtualHostNode.PERMITTED_NODES, permittedNodes));
    assertTrue("Permitted nodes were not changed on Replica", _permittedNodesLatch.await(10, TimeUnit.SECONDS));
    assertEquals("Not the same permitted nodes", new HashSet<>(node1.getPermittedNodes()), new HashSet<>(node2.getPermittedNodes()));
    assertEquals("Unexpected counter of changes permitted nodes", 1, permittedNodesChangeCounter.get());
    // change the order of permitted nodes
    Collections.swap(permittedNodes, 0, 2);
    node1.setAttributes(Collections.<String, Object>singletonMap(BDBHAVirtualHostNode.PERMITTED_NODES, permittedNodes));
    // make sure that node2 onNodeState was invoked by performing transaction on master and making sure that it was replicated
    performTransactionAndAwaitForRemoteNodeToGetAware(node1, remote);
    // perform transaction second time because permitted nodes are changed after last transaction id
    performTransactionAndAwaitForRemoteNodeToGetAware(node1, remote);
    assertEquals("Unexpected counter of changes permitted nodes", 1, permittedNodesChangeCounter.get());
}
Also used : ArrayList(java.util.ArrayList) CountDownLatch(java.util.concurrent.CountDownLatch) AbstractConfigurationChangeListener(org.apache.qpid.server.model.AbstractConfigurationChangeListener) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ConfiguredObject(org.apache.qpid.server.model.ConfiguredObject)

Example 13 with AbstractConfigurationChangeListener

use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.

the class AbstractConfiguredObjectTest method testSuccessfulDeletion.

public void testSuccessfulDeletion() throws Exception {
    TestConfiguredObject configuredObject = new TestConfiguredObject("configuredObject");
    configuredObject.create();
    final List<ChangeEvent> events = new ArrayList<>();
    configuredObject.addChangeListener(new AbstractConfigurationChangeListener() {

        @Override
        public void attributeSet(ConfiguredObject<?> object, String attributeName, Object oldAttributeValue, Object newAttributeValue) {
            events.add(new ChangeEvent(EventType.ATTRIBUTE_SET, object, attributeName, oldAttributeValue, newAttributeValue));
        }

        @Override
        public void stateChanged(ConfiguredObject<?> object, State oldState, State newState) {
            events.add(new ChangeEvent(EventType.STATE_CHANGED, object, ConfiguredObject.DESIRED_STATE, oldState, newState));
        }
    });
    configuredObject.delete();
    assertEquals(2, events.size());
    assertEquals(State.DELETED, configuredObject.getDesiredState());
    assertEquals(State.DELETED, configuredObject.getState());
    assertEquals("Unexpected events number", 2, events.size());
    ChangeEvent event0 = events.get(0);
    ChangeEvent event1 = events.get(1);
    assertEquals("Unexpected first event: " + event0, new ChangeEvent(EventType.STATE_CHANGED, configuredObject, Exchange.DESIRED_STATE, State.ACTIVE, State.DELETED), event0);
    assertEquals("Unexpected second event: " + event1, new ChangeEvent(EventType.ATTRIBUTE_SET, configuredObject, Exchange.DESIRED_STATE, State.ACTIVE, State.DELETED), event1);
}
Also used : State(org.apache.qpid.server.model.State) ArrayList(java.util.ArrayList) ConfiguredObject(org.apache.qpid.server.model.ConfiguredObject) AbstractConfigurationChangeListener(org.apache.qpid.server.model.AbstractConfigurationChangeListener)

Example 14 with AbstractConfigurationChangeListener

use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.

the class AbstractConfiguredObjectTest method testSetAttributesFiresListener.

public void testSetAttributesFiresListener() {
    final String objectName = "listenerFiring";
    Map<String, Object> attributes = new HashMap<>();
    attributes.put(ConfiguredObject.NAME, objectName);
    attributes.put(TestSingleton.STRING_VALUE, "first");
    final TestSingleton object = _model.getObjectFactory().create(TestSingleton.class, attributes, null);
    final AtomicInteger listenerCount = new AtomicInteger();
    final LinkedHashMap<String, String> updates = new LinkedHashMap<>();
    object.addChangeListener(new AbstractConfigurationChangeListener() {

        @Override
        public void attributeSet(final ConfiguredObject<?> object, final String attributeName, final Object oldAttributeValue, final Object newAttributeValue) {
            listenerCount.incrementAndGet();
            String delta = String.valueOf(oldAttributeValue) + "=>" + String.valueOf(newAttributeValue);
            updates.put(attributeName, delta);
        }
    });
    // Set updated value (should cause listener to fire)
    object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "second"));
    assertEquals(1, listenerCount.get());
    String delta = updates.remove(TestSingleton.STRING_VALUE);
    assertEquals("first=>second", delta);
    // Set unchanged value (should not cause listener to fire)
    object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "second"));
    assertEquals(1, listenerCount.get());
    // Set value to null (should cause listener to fire)
    object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, null));
    assertEquals(2, listenerCount.get());
    delta = updates.remove(TestSingleton.STRING_VALUE);
    assertEquals("second=>null", delta);
    // Set to null again (should not cause listener to fire)
    object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, null));
    assertEquals(2, listenerCount.get());
    // Set updated value (should cause listener to fire)
    object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "third"));
    assertEquals(3, listenerCount.get());
    delta = updates.remove(TestSingleton.STRING_VALUE);
    assertEquals("null=>third", delta);
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ConfiguredObject(org.apache.qpid.server.model.ConfiguredObject) AbstractConfiguredObject(org.apache.qpid.server.model.AbstractConfiguredObject) LinkedHashMap(java.util.LinkedHashMap) AbstractConfigurationChangeListener(org.apache.qpid.server.model.AbstractConfigurationChangeListener)

Example 15 with AbstractConfigurationChangeListener

use of org.apache.qpid.server.model.AbstractConfigurationChangeListener in project qpid-broker-j by apache.

the class AbstractConfiguredObjectTest method testSetAttributesInterpolateValues.

public void testSetAttributesInterpolateValues() {
    setTestSystemProperty("foo1", "myValue1");
    setTestSystemProperty("foo2", "myValue2");
    setTestSystemProperty("foo3", null);
    Map<String, Object> attributes = new HashMap<>();
    attributes.put(ConfiguredObject.NAME, getTestName());
    attributes.put(TestSingleton.STRING_VALUE, "${foo1}");
    final TestSingleton object = _model.getObjectFactory().create(TestSingleton.class, attributes, null);
    final AtomicInteger listenerCount = new AtomicInteger();
    object.addChangeListener(new AbstractConfigurationChangeListener() {

        @Override
        public void attributeSet(final ConfiguredObject<?> object, final String attributeName, final Object oldAttributeValue, final Object newAttributeValue) {
            listenerCount.incrementAndGet();
        }
    });
    assertEquals("myValue1", object.getStringValue());
    assertEquals("${foo1}", object.getActualAttributes().get(TestSingleton.STRING_VALUE));
    // Update the actual value ${foo1} => ${foo2}
    object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "${foo2}"));
    assertEquals(1, listenerCount.get());
    assertEquals("myValue2", object.getStringValue());
    assertEquals("${foo2}", object.getActualAttributes().get(TestSingleton.STRING_VALUE));
    // No change
    object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "${foo2}"));
    assertEquals(1, listenerCount.get());
    // Update the actual value ${foo2} => ${foo3} (which doesn't have a value)
    object.setAttributes(Collections.singletonMap(TestSingleton.STRING_VALUE, "${foo3}"));
    assertEquals(2, listenerCount.get());
    assertEquals("${foo3}", object.getStringValue());
    assertEquals("${foo3}", object.getActualAttributes().get(TestSingleton.STRING_VALUE));
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ConfiguredObject(org.apache.qpid.server.model.ConfiguredObject) AbstractConfiguredObject(org.apache.qpid.server.model.AbstractConfiguredObject) AbstractConfigurationChangeListener(org.apache.qpid.server.model.AbstractConfigurationChangeListener)

Aggregations

AbstractConfigurationChangeListener (org.apache.qpid.server.model.AbstractConfigurationChangeListener)16 ConfiguredObject (org.apache.qpid.server.model.ConfiguredObject)12 State (org.apache.qpid.server.model.State)9 CountDownLatch (java.util.concurrent.CountDownLatch)6 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)5 Durability (com.sleepycat.je.Durability)3 File (java.io.File)3 AbstractConfiguredObject (org.apache.qpid.server.model.AbstractConfiguredObject)3 ConfigurationChangeListener (org.apache.qpid.server.model.ConfigurationChangeListener)3 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 LinkedHashMap (java.util.LinkedHashMap)2 AtomicReference (java.util.concurrent.atomic.AtomicReference)2 VirtualHostNode (org.apache.qpid.server.model.VirtualHostNode)2 StoreConfigurationChangeListener (org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener)1 Broker (org.apache.qpid.server.model.Broker)1 ConfiguredObjectFinder (org.apache.qpid.server.model.ConfiguredObjectFinder)1 IllegalStateTransitionException (org.apache.qpid.server.model.IllegalStateTransitionException)1 RemoteReplicationNode (org.apache.qpid.server.model.RemoteReplicationNode)1 TrustStore (org.apache.qpid.server.model.TrustStore)1