summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorAlex Rudyy <orudyy@apache.org>2014-10-08 12:30:14 +0000
committerAlex Rudyy <orudyy@apache.org>2014-10-08 12:30:14 +0000
commit8202ba3c4da8592062e70789389ff527dc58d8df (patch)
tree3b4af2a6fccdfdfba1b5a2e36eb1060355c05d0e /qpid/java
parente07743fdced09066219f42acadfe31d43e9465b0 (diff)
downloadqpid-python-8202ba3c4da8592062e70789389ff527dc58d8df.tar.gz
QPID-6136: [Java Broker] Set permitted nodes on replica BDB HA VHN only when they are changed
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1630080 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java8
-rw-r--r--qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java69
2 files changed, 73 insertions, 4 deletions
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
index 25890029f9..230b478a68 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
@@ -260,7 +260,7 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode<BDBHAVirtu
public String toString()
{
return "BDBHAVirtualHostNodeImpl [id=" + getId() + ", name=" + getName() + ", storePath=" + _storePath + ", groupName=" + _groupName + ", address=" + _address
- + ", state=" + getState() + ", priority=" + _priority + ", designatedPrimary=" + _designatedPrimary + ", quorumOverride=" + _quorumOverride + "]";
+ + ", state=" + getState() + ", priority=" + _priority + ", designatedPrimary=" + _designatedPrimary + ", quorumOverride=" + _quorumOverride + ", role=" + getRole() + "]";
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@@ -612,7 +612,7 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode<BDBHAVirtu
private void onDetached()
{
- createReplicaVirtualHost();
+ closeVirtualHostIfExist();
}
private void createReplicaVirtualHost()
@@ -652,7 +652,7 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode<BDBHAVirtu
if (LOGGER.isInfoEnabled())
{
- LOGGER.info("Received BDB event indicating transition to state " + state);
+ LOGGER.info("Received BDB event indicating transition to state " + state + " for " + getName());
}
NodeRole previousRole = getRole();
try
@@ -1006,7 +1006,7 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode<BDBHAVirtu
{
byte[] applicationState = nodeState.getAppState();
Set<String> permittedNodes = ReplicatedEnvironmentFacade.convertApplicationStateBytesToPermittedNodeList(applicationState);
- if (!_permittedNodes.equals(permittedNodes))
+ if (_permittedNodes.size() != permittedNodes.size() || !_permittedNodes.containsAll(permittedNodes))
{
if (_permittedNodes.contains(remoteNode.getAddress()))
{
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
index 19365a6478..e23346cd6a 100644
--- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
+++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
@@ -28,10 +28,12 @@ import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import com.sleepycat.je.Durability;
@@ -46,6 +48,7 @@ import org.apache.qpid.server.model.RemoteReplicationNode;
import org.apache.qpid.server.model.State;
import org.apache.qpid.server.model.VirtualHost;
import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.store.berkeleydb.replication.DatabasePinger;
import org.apache.qpid.server.virtualhost.berkeleydb.BDBHAVirtualHost;
import org.apache.qpid.server.virtualhost.berkeleydb.BDBHAVirtualHostImpl;
import org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHARemoteReplicationNode;
@@ -531,6 +534,72 @@ public class BDBHAVirtualHostNodeTest extends QpidTestCase
remote.delete();
}
+ 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 NoopConfigurationChangeListener()
+ {
+ @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());
+ }
+
+ private void performTransactionAndAwaitForRemoteNodeToGetAware(BDBHAVirtualHostNode<?> node1, BDBHARemoteReplicationNode<?> remote) throws InterruptedException
+ {
+ new DatabasePinger().pingDb(((BDBConfigurationStore)node1.getConfigurationStore()).getEnvironmentFacade());
+
+ int waitCounter = 100;
+ while ( remote.getLastKnownReplicationTransactionId() != node1.getLastKnownReplicationTransactionId() && (waitCounter--) != 0)
+ {
+ Thread.sleep(100l);
+ }
+ assertEquals("Last transaction was not replicated", new Long(remote.getLastKnownReplicationTransactionId()), node1.getLastKnownReplicationTransactionId() );
+ }
+
public void testIntruderConnected() throws Exception
{
int node1PortNumber = _portHelper.getNextAvailable();