Author: orudyy
Date: Wed Oct  8 12:30:14 2014
New Revision: 1630080

URL: http://svn.apache.org/r1630080
Log:
QPID-6136: [Java Broker] Set permitted nodes on replica BDB HA VHN only when 
they are changed

Modified:
    
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
    
qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java

Modified: 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java?rev=1630080&r1=1630079&r2=1630080&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
 Wed Oct  8 12:30:14 2014
@@ -260,7 +260,7 @@ public class BDBHAVirtualHostNodeImpl ex
     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 ex
 
     private void onDetached()
     {
-        createReplicaVirtualHost();
+        closeVirtualHostIfExist();
     }
 
     private void createReplicaVirtualHost()
@@ -652,7 +652,7 @@ public class BDBHAVirtualHostNodeImpl ex
 
             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 ex
                     {
                         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()))
                             {

Modified: 
qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java?rev=1630080&r1=1630079&r2=1630080&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
 Wed Oct  8 12:30:14 2014
@@ -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.Remo
 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 ex
         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();



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

Reply via email to