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]