Author: orudyy
Date: Tue Dec 29 22:57:18 2015
New Revision: 1722246

URL: http://svn.apache.org/viewvc?rev=1722246&view=rev
Log:
QPID-6959: Restore environment mutating operations on BDB HA VHN when 
environment is restarting

Modified:
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
    
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
    
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeTest.java
    
qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/TwoNodeTest.java

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java?rev=1722246&r1=1722245&r2=1722246&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
 Tue Dec 29 22:57:18 2015
@@ -723,7 +723,7 @@ public class ReplicatedEnvironmentFacade
     {
         try
         {
-            final ReplicatedEnvironment environment = getEnvironment();
+            final ReplicatedEnvironment environment = getEnvironment(false);
             final EnvironmentMutableConfig oldConfig = 
environment.getMutableConfig();
             final EnvironmentMutableConfig newConfig = 
oldConfig.setCacheSize(cacheSize);
             environment.setMutableConfig(newConfig);
@@ -860,7 +860,7 @@ public class ReplicatedEnvironmentFacade
     {
         try
         {
-            ReplicatedEnvironment environment = getEnvironment();
+            ReplicatedEnvironment environment = getEnvironment(false);
             final ReplicationMutableConfig oldConfig = 
environment.getRepMutableConfig();
             final ReplicationMutableConfig newConfig = 
oldConfig.setDesignatedPrimary(isPrimary);
             environment.setRepMutableConfig(newConfig);
@@ -909,7 +909,7 @@ public class ReplicatedEnvironmentFacade
     {
         try
         {
-            final ReplicatedEnvironment environment = getEnvironment();
+            final ReplicatedEnvironment environment = getEnvironment(false);
             final ReplicationMutableConfig oldConfig = 
environment.getRepMutableConfig();
             final ReplicationMutableConfig newConfig = 
oldConfig.setNodePriority(priority);
             environment.setRepMutableConfig(newConfig);
@@ -958,7 +958,7 @@ public class ReplicatedEnvironmentFacade
     {
         try
         {
-            final ReplicatedEnvironment environment = getEnvironment();
+            final ReplicatedEnvironment environment = getEnvironment(false);
             final ReplicationMutableConfig oldConfig = 
environment.getRepMutableConfig();
             final ReplicationMutableConfig newConfig = 
oldConfig.setElectableGroupSizeOverride(electableGroupOverride);
             environment.setRepMutableConfig(newConfig);
@@ -1071,7 +1071,12 @@ public class ReplicatedEnvironmentFacade
 
     private ReplicatedEnvironment getEnvironment()
     {
-        if (getFacadeState() == State.RESTARTING)
+        return getEnvironment(true);
+    }
+
+    private ReplicatedEnvironment getEnvironment(boolean throwOnRestart)
+    {
+        if (throwOnRestart && getFacadeState() == State.RESTARTING)
         {
             throw new ConnectionScopedRuntimeException("Environment is 
restarting");
         }

Modified: 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java?rev=1722246&r1=1722245&r2=1722246&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
 Tue Dec 29 22:57:18 2015
@@ -179,6 +179,48 @@ public class BDBHAVirtualHostNodeTest ex
         assertNotNull("Last known replication transaction id should be set", 
node.getLastKnownReplicationTransactionId());
     }
 
+    public void testMutableAttributesAfterMajorityLost() throws Exception
+    {
+        int node1PortNumber = _portHelper.getNextAvailable();
+        int node2PortNumber = _portHelper.getNextAvailable();
+        int node3PortNumber = _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, node3PortNumber);
+        BDBHAVirtualHostNode<?> node1 = 
_helper.createAndStartHaVHN(node1Attributes);
+
+        Map<String, Object> node2Attributes = 
_helper.createNodeAttributes("node2", groupName, "localhost:" + 
node2PortNumber, helperAddress, nodeName);
+        BDBHAVirtualHostNode<?> node2 = 
_helper.createAndStartHaVHN(node2Attributes);
+
+        Map<String, Object> node3Attributes = 
_helper.createNodeAttributes("node3", groupName, "localhost:" + 
node3PortNumber, helperAddress, nodeName);
+        BDBHAVirtualHostNode<?> node3 = 
_helper.createAndStartHaVHN(node3Attributes);
+
+        assertEquals("Unexpected node priority value before mutation", 1, 
node1.getPriority());
+        assertFalse("Unexpected designated primary value before mutation", 
node1.isDesignatedPrimary());
+        assertEquals("Unexpected electable group override value before 
mutation", 0, node1.getQuorumOverride());
+
+        node2.close();
+        node3.close();
+
+        _helper.assertNodeRole(node1, NodeRole.DETACHED);
+
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(BDBHAVirtualHostNode.PRIORITY, 200);
+        attributes.put(BDBHAVirtualHostNode.DESIGNATED_PRIMARY, true);
+        attributes.put(BDBHAVirtualHostNode.QUORUM_OVERRIDE, 1);
+        node1.setAttributes(attributes);
+
+        _helper.awaitForVirtualhost(node1, 30000);
+
+        assertEquals("Unexpected node priority value after mutation", 200, 
node1.getPriority());
+        assertTrue("Unexpected designated primary value after mutation", 
node1.isDesignatedPrimary());
+        assertEquals("Unexpected electable group override value after 
mutation", 1, node1.getQuorumOverride());
+
+    }
+
     public void testTransferMasterToSelf() throws Exception
     {
         int node1PortNumber = _portHelper.getNextAvailable();

Modified: 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeTest.java?rev=1722246&r1=1722245&r2=1722246&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeTest.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeTest.java
 Tue Dec 29 22:57:18 2015
@@ -926,6 +926,91 @@ public class ReplicatedEnvironmentFacade
         }
     }
 
+    public void testSetElectableGroupSizeOverrideAfterMajorityLost()  throws 
Exception
+    {
+        final CountDownLatch recoveredLatch = new CountDownLatch(1);
+        final CountDownLatch majorityLost = new CountDownLatch(1);
+        ReplicationGroupListener listener = new NoopReplicationGroupListener()
+        {
+            @Override
+            public void onNoMajority()
+            {
+                majorityLost.countDown();
+            }
+
+            @Override
+            public void onReplicationNodeRecovered(ReplicationNode node)
+            {
+                if (node.getName().equals(TEST_NODE_NAME))
+                {
+                    recoveredLatch.countDown();
+                }
+            }
+        };
+        ReplicatedEnvironmentFacade master = createMaster(listener);
+
+
+        int replica1Port = _portHelper.getNextAvailable();
+        String node1NodeHostPort = "localhost:" + replica1Port;
+        int replica2Port = _portHelper.getNextAvailable();
+        String node2NodeHostPort = "localhost:" + replica2Port;
+
+        master.setPermittedNodes(Arrays.asList(master.getHostPort(), 
node1NodeHostPort, node2NodeHostPort));
+
+        ReplicatedEnvironmentFacade replica1 = createReplica(TEST_NODE_NAME + 
"_1", node1NodeHostPort, new NoopReplicationGroupListener());
+        ReplicatedEnvironmentFacade replica2 = createReplica(TEST_NODE_NAME + 
"_2", node2NodeHostPort, new NoopReplicationGroupListener());
+
+        replica1.close();
+        replica2.close();
+
+        assertTrue("Majority lost is undetected", majorityLost.await(2, 
TimeUnit.SECONDS));
+        assertEquals("Unexpected facade state", 
ReplicatedEnvironmentFacade.State.RESTARTING, master.getFacadeState());
+        assertEquals("Master node should not be recovered", 1, 
recoveredLatch.getCount());
+        master.setElectableGroupSizeOverride(1);
+        assertTrue("Master was not recovered after electable group override 
change", majorityLost.await(2, TimeUnit.SECONDS));
+    }
+
+    public void testSetDesignatedPrimaryAfterMajorityLost()  throws Exception
+    {
+        final CountDownLatch recoveredLatch = new CountDownLatch(1);
+        final CountDownLatch majorityLost = new CountDownLatch(1);
+        ReplicationGroupListener listener = new NoopReplicationGroupListener()
+        {
+            @Override
+            public void onNoMajority()
+            {
+                majorityLost.countDown();
+            }
+
+            @Override
+            public void onReplicationNodeRecovered(ReplicationNode node)
+            {
+                if (node.getName().equals(TEST_NODE_NAME))
+                {
+                    recoveredLatch.countDown();
+                }
+            }
+        };
+        ReplicatedEnvironmentFacade master = createMaster(listener);
+
+
+        int replica1Port = _portHelper.getNextAvailable();
+        String node1NodeHostPort = "localhost:" + replica1Port;
+        int replica2Port = _portHelper.getNextAvailable();
+        String node2NodeHostPort = "localhost:" + replica2Port;
+
+        master.setPermittedNodes(Arrays.asList(master.getHostPort(), 
node1NodeHostPort, node2NodeHostPort));
+
+        ReplicatedEnvironmentFacade replica1 = createReplica(TEST_NODE_NAME + 
"_1", node1NodeHostPort, new NoopReplicationGroupListener());
+        replica1.close();
+
+        assertTrue("Majority lost is undetected", majorityLost.await(2, 
TimeUnit.SECONDS));
+        assertEquals("Unexpected facade state", 
ReplicatedEnvironmentFacade.State.RESTARTING, master.getFacadeState());
+        assertEquals("Master node should not be recovered", 1, 
recoveredLatch.getCount());
+        master.setDesignatedPrimary(true);
+        assertTrue("Master was not recovered after being assigned as 
designated primary", majorityLost.await(2, TimeUnit.SECONDS));
+    }
+
     private void putRecord(final ReplicatedEnvironmentFacade master, final 
Database db, final int keyValue,
                            final String dataValue)
     {

Modified: 
qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/TwoNodeTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/TwoNodeTest.java?rev=1722246&r1=1722245&r2=1722246&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/TwoNodeTest.java
 (original)
+++ 
qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/TwoNodeTest.java
 Tue Dec 29 22:57:18 2015
@@ -180,4 +180,21 @@ public class TwoNodeTest extends QpidBro
         assertProducingConsuming(connection);
     }
 
+    public void testSetDesignatedAfterReplicaBeingStopped() throws Exception
+    {
+        startCluster(false);
+
+        
_groupCreator.stopNode(_groupCreator.getBrokerPortNumberOfSecondaryNode());
+
+        Map<String, Object> secondaryNodeAttributes = 
_groupCreator.getNodeAttributes(_groupCreator.getBrokerPortNumberOfPrimary());
+        assertFalse("Expected node to NOT be set as designated primary", 
(Boolean) secondaryNodeAttributes.get(BDBHAVirtualHostNode.DESIGNATED_PRIMARY));
+
+        
_groupCreator.setNodeAttributes(_groupCreator.getBrokerPortNumberOfPrimary(), 
Collections.<String, 
Object>singletonMap(BDBHAVirtualHostNode.DESIGNATED_PRIMARY, true));
+        
_groupCreator.awaitNodeToAttainRole(_groupCreator.getBrokerPortNumberOfPrimary(),
 "MASTER" );
+
+        final Connection connection = getConnection(_positiveFailoverUrl);
+        assertNotNull("Expected to get a valid connection to primary", 
connection);
+        assertProducingConsuming(connection);
+    }
+
 }



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

Reply via email to