diff options
Diffstat (limited to 'qpid/java/bdbstore/systests/src/test/java/org/apache/qpid')
4 files changed, 86 insertions, 39 deletions
diff --git a/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/BDBHAVirtualHostNodeRestTest.java b/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/BDBHAVirtualHostNodeRestTest.java index 301375d0fb..fcbd210311 100644 --- a/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/BDBHAVirtualHostNodeRestTest.java +++ b/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/BDBHAVirtualHostNodeRestTest.java @@ -226,7 +226,7 @@ public class BDBHAVirtualHostNodeRestTest extends QpidRestTestCase assertEquals("Unexpected number of remote nodes on " + NODE2, 1, data.size()); } - public void testIntruderBDBHAVHNNotAllowedNoConnect() throws Exception + public void testIntruderBDBHAVHNNotAllowedToConnect() throws Exception { createHANode(NODE1, _node1HaPort, _node1HaPort); assertNode(NODE1, _node1HaPort, _node1HaPort, NODE1); @@ -304,6 +304,7 @@ public class BDBHAVirtualHostNodeRestTest extends QpidRestTestCase intruder.close(); } } + waitForAttributeChanged(_baseNodeRestUrl + NODE1, VirtualHostNode.STATE, State.ERRORED.name()); waitForAttributeChanged(_baseNodeRestUrl + NODE3, VirtualHostNode.STATE, State.ERRORED.name()); } @@ -329,7 +330,11 @@ public class BDBHAVirtualHostNodeRestTest extends QpidRestTestCase nodeData.put(BDBHAVirtualHostNode.HELPER_NODE_NAME, NODE1); Map<String,String> context = new HashMap<>(); nodeData.put(BDBHAVirtualHostNode.CONTEXT, context); - String bluePrint = GroupCreator.getBlueprint("localhost", _node1HaPort, _node2HaPort, _node3HaPort); + if (nodePort == helperPort) + { + nodeData.put(BDBHAVirtualHostNode.PERMITTED_NODES, GroupCreator.getPermittedNodes("localhost", _node1HaPort, _node2HaPort, _node3HaPort)); + } + String bluePrint = GroupCreator.getBlueprint(); context.put(AbstractVirtualHostNode.VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, bluePrint); return nodeData; } diff --git a/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/BDBHAVirtualHostRestTest.java b/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/BDBHAVirtualHostRestTest.java index 07ce033a55..f73a2878d3 100644 --- a/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/BDBHAVirtualHostRestTest.java +++ b/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/BDBHAVirtualHostRestTest.java @@ -27,6 +27,7 @@ import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; @@ -49,6 +50,8 @@ public class BDBHAVirtualHostRestTest extends QpidRestTestCase private Object _nodeName; private String _virtualhostUrl; private String _bluePrint; + private List<String> _permittedNodes; + private String _address; @Override public void setUp() throws Exception @@ -59,8 +62,9 @@ public class BDBHAVirtualHostRestTest extends QpidRestTestCase _storeBaseDir = new File(TMP_FOLDER, "store-" + _hostName + "-" + System.currentTimeMillis()); _nodeHaPort = getNextAvailable(getRestTestHelper().getHttpPort() + 1); _virtualhostUrl = "virtualhost/" + _nodeName + "/" + _hostName; - _bluePrint = GroupCreator.getBlueprint("localhost", _nodeHaPort); - + _bluePrint = GroupCreator.getBlueprint(); + _permittedNodes = GroupCreator.getPermittedNodes("localhost", _nodeHaPort); + _address = "localhost:" + _nodeHaPort; super.setUp(); } @@ -93,9 +97,11 @@ public class BDBHAVirtualHostRestTest extends QpidRestTestCase nodeAttributes.put(BDBHAVirtualHostNode.TYPE, "BDB_HA"); nodeAttributes.put(BDBHAVirtualHostNode.STORE_PATH, _storeBaseDir.getPath() + File.separator + _nodeName); nodeAttributes.put(BDBHAVirtualHostNode.GROUP_NAME, _hostName); - nodeAttributes.put(BDBHAVirtualHostNode.ADDRESS, "localhost:" + _nodeHaPort); + nodeAttributes.put(BDBHAVirtualHostNode.ADDRESS, _address); nodeAttributes.put(BDBHAVirtualHostNode.HELPER_ADDRESS, "localhost:" + _nodeHaPort); nodeAttributes.put(BDBHAVirtualHostNode.HELPER_NODE_NAME, _nodeName); + + nodeAttributes.put(BDBHAVirtualHostNode.PERMITTED_NODES, _permittedNodes); Map<String, String> context = new HashMap<String,String>(); context.put(AbstractVirtualHostNode.VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, _bluePrint); diff --git a/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/GroupCreator.java b/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/GroupCreator.java index f7dce4f3f5..673e492d52 100644 --- a/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/GroupCreator.java +++ b/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/GroupCreator.java @@ -52,7 +52,6 @@ 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.VirtualHostNode; -import org.apache.qpid.server.virtualhost.berkeleydb.BDBHAVirtualHost; import org.apache.qpid.server.virtualhost.berkeleydb.BDBHAVirtualHostImpl; import org.apache.qpid.server.virtualhostnode.AbstractVirtualHostNode; import org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHARemoteReplicationNode; @@ -118,7 +117,8 @@ public class GroupCreator brokerPort = _testcase.getNextAvailable(bdbPort + 1); } - String bluePrintJson = getBlueprint(_ipAddressOfBroker, bdbPorts); + String bluePrintJson = getBlueprint(); + List<String> permittedNodes = getPermittedNodes(_ipAddressOfBroker, bdbPorts); String helperName = null; for (Map.Entry<Integer,Integer> entry: _brokerPortToBdbPortMap.entrySet()) @@ -145,6 +145,7 @@ public class GroupCreator virtualHostNodeAttributes.put(BDBHAVirtualHostNode.HELPER_ADDRESS, getHelperHostPort()); virtualHostNodeAttributes.put(BDBHAVirtualHostNode.TYPE, BDBHAVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE); virtualHostNodeAttributes.put(BDBHAVirtualHostNode.HELPER_NODE_NAME, helperName); + virtualHostNodeAttributes.put(BDBHAVirtualHostNode.PERMITTED_NODES, permittedNodes); Map<String, String> context = new HashMap<>(); context.put(ReplicationConfig.INSUFFICIENT_REPLICAS_TIMEOUT, "2 s"); @@ -365,11 +366,6 @@ public class GroupCreator return _ipAddressOfBroker + ":" + _bdbHelperPort; } - public void setHelperHostPort(int bdbHelperPort) - { - _bdbHelperPort = bdbHelperPort; - } - public int getBrokerPortNumberOfPrimary() { if (_numberOfNodes != 2) @@ -406,21 +402,6 @@ public class GroupCreator } } - public void modifyClusterNodeBdbAddress(int brokerPortNumberToBeMoved, int newBdbPort) - { - TestBrokerConfiguration config = _testcase.getBrokerConfiguration(brokerPortNumberToBeMoved); - String nodeName = getNodeNameForNodeAt(_brokerPortToBdbPortMap.get(brokerPortNumberToBeMoved)); - - Map<String, Object> objectAttributes = config.getObjectAttributes(VirtualHostNode.class, nodeName); - - String oldBdbHostPort = (String)objectAttributes.get(BDBHAVirtualHostNode.ADDRESS); - String[] oldHostAndPort = StringUtils.split(oldBdbHostPort, ":"); - String oldHost = oldHostAndPort[0]; - String newBdbHostPort = oldHost + ":" + newBdbPort; - config.setObjectAttribute(VirtualHostNode.class, nodeName, BDBHAVirtualHostNode.ADDRESS, newBdbHostPort); - config.setSaved(false); - } - public String getNodeNameForBrokerPort(final int brokerPort) { return getNodeNameForNodeAt(_brokerPortToBdbPortMap.get(brokerPort)); @@ -491,20 +472,25 @@ public class GroupCreator public void awaitNodeToAttainRole(int localNodePort, int remoteNodePort, String desiredRole) throws Exception { + awaitNodeToAttainAttributeValue(localNodePort, remoteNodePort, BDBHARemoteReplicationNode.ROLE, desiredRole); + } + + public void awaitNodeToAttainAttributeValue(int localNodePort, int remoteNodePort, String attributeName, String desiredValue) throws Exception + { final long startTime = System.currentTimeMillis(); Map<String, Object> data = Collections.emptyMap(); - while(!desiredRole.equals(data.get(BDBHARemoteReplicationNode.ROLE)) && (System.currentTimeMillis() - startTime) < 30000) + while(!desiredValue.equals(data.get(attributeName)) && (System.currentTimeMillis() - startTime) < 30000) { - LOGGER.debug("Awaiting node '" + getNodeNameForBrokerPort(remoteNodePort) + "' to transit into " + desiredRole + " role"); + LOGGER.debug("Awaiting node '" + getNodeNameForBrokerPort(remoteNodePort) + "' to transit into " + desiredValue + " role"); data = getNodeAttributes(localNodePort, remoteNodePort); - if (!desiredRole.equals(data.get(BDBHARemoteReplicationNode.ROLE))) + if (!desiredValue.equals(data.get(attributeName))) { Thread.sleep(1000); } } - LOGGER.debug("Node '" + getNodeNameForBrokerPort(remoteNodePort) + "' role is " + data.get(BDBHARemoteReplicationNode.ROLE)); - Assert.assertEquals("Node is in unexpected role", desiredRole, data.get(BDBHARemoteReplicationNode.ROLE)); + LOGGER.debug("Node '" + getNodeNameForBrokerPort(remoteNodePort) + "' attribute '" + attributeName + "' is " + data.get(attributeName)); + Assert.assertEquals("Unexpected " + attributeName + " at " + localNodePort, desiredValue, data.get(attributeName)); } public RestTestHelper createRestTestHelper(int brokerPort) @@ -515,16 +501,10 @@ public class GroupCreator return helper; } - public static String getBlueprint(String hostName, int... ports) throws Exception + public static String getBlueprint() throws Exception { - List<String> permittedNodes = new ArrayList<String>(); - for (int port:ports) - { - permittedNodes.add(hostName + ":" + port); - } Map<String,Object> bluePrint = new HashMap<>(); bluePrint.put(VirtualHost.TYPE, BDBHAVirtualHostImpl.VIRTUAL_HOST_TYPE); - bluePrint.put(BDBHAVirtualHost.PERMITTED_NODES, permittedNodes); StringWriter writer = new StringWriter(); ObjectMapper mapper = new ObjectMapper(); @@ -532,4 +512,14 @@ public class GroupCreator mapper.writeValue(writer, bluePrint); return writer.toString(); } + + public static List<String> getPermittedNodes(String hostName, int... ports) + { + List<String> permittedNodes = new ArrayList<String>(); + for (int port: ports) + { + permittedNodes.add(hostName + ":" + port); + } + return permittedNodes; + } } diff --git a/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/MultiNodeTest.java b/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/MultiNodeTest.java index d6ba419de1..5701c8c9c8 100644 --- a/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/MultiNodeTest.java +++ b/qpid/java/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/MultiNodeTest.java @@ -33,10 +33,15 @@ import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.Session; +import com.sleepycat.je.Durability; +import com.sleepycat.je.EnvironmentConfig; +import com.sleepycat.je.rep.ReplicatedEnvironment; +import com.sleepycat.je.rep.ReplicationConfig; import org.apache.log4j.Logger; import org.apache.qpid.client.AMQConnection; import org.apache.qpid.jms.ConnectionListener; import org.apache.qpid.jms.ConnectionURL; +import org.apache.qpid.server.model.State; import org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHAVirtualHostNode; import org.apache.qpid.test.utils.QpidBrokerTestCase; import org.apache.qpid.test.utils.TestUtils; @@ -320,6 +325,47 @@ public class MultiNodeTest extends QpidBrokerTestCase assertProducingConsuming(connection); } + public void testClusterCannotStartWithIntruder() throws Exception + { + int intruderPort = getNextAvailable(Collections.max(_groupCreator.getBdbPortNumbers()) + 1); + String nodeName = "intruder"; + String nodeHostPort = _groupCreator.getIpAddressOfBrokerHost() + ":" + intruderPort; + File environmentPathFile = new File(System.getProperty("QPID_WORK"), intruderPort + ""); + environmentPathFile.mkdirs(); + ReplicationConfig replicationConfig = new ReplicationConfig(_groupCreator.getGroupName(), nodeName, nodeHostPort); + replicationConfig.setHelperHosts(_groupCreator.getHelperHostPort()); + EnvironmentConfig envConfig = new EnvironmentConfig(); + envConfig.setAllowCreate(true); + envConfig.setTransactional(true); + envConfig.setDurability(new Durability(Durability.SyncPolicy.SYNC, Durability.SyncPolicy.WRITE_NO_SYNC, Durability.ReplicaAckPolicy.SIMPLE_MAJORITY)); + + ReplicatedEnvironment intruder = null; + try + { + intruder = new ReplicatedEnvironment(environmentPathFile, replicationConfig, envConfig); + } + finally + { + if (intruder != null) + { + intruder.close(); + } + } + + for (int port: _groupCreator.getBrokerPortNumbersForNodes()) + { + _groupCreator.awaitNodeToAttainAttributeValue(port, port, BDBHAVirtualHostNode.STATE, State.ERRORED.name()); + } + + _groupCreator.stopCluster(); + _groupCreator.startCluster(); + + for (int port: _groupCreator.getBrokerPortNumbersForNodes()) + { + _groupCreator.awaitNodeToAttainAttributeValue(port, port, BDBHAVirtualHostNode.STATE, State.ERRORED.name()); + } + } + private final class FailoverAwaitingListener implements ConnectionListener { private final CountDownLatch _failoverCompletionLatch = new CountDownLatch(1); |