Author: kwall
Date: Thu Feb 18 13:37:31 2016
New Revision: 1731073

URL: http://svn.apache.org/viewvc?rev=1731073&view=rev
Log:
QPID-7080: [Java Tests - BDB HA] Prevent sporadic failure from 
MultiNodeTest#testQuorumOverride

Modified:
    
qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/MultiNodeTest.java
    
qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java

Modified: 
qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/MultiNodeTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/MultiNodeTest.java?rev=1731073&r1=1731072&r2=1731073&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/MultiNodeTest.java
 (original)
+++ 
qpid/java/trunk/bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/MultiNodeTest.java
 Thu Feb 18 13:37:31 2016
@@ -62,10 +62,6 @@ import org.apache.qpid.test.utils.QpidBr
 import org.apache.qpid.test.utils.TestUtils;
 import org.apache.qpid.util.FileUtils;
 
-/**
- * The HA black box tests test the BDB cluster as a opaque unit.  Client 
connects to
- * the cluster via a failover url
- */
 public class MultiNodeTest extends QpidBrokerTestCase
 {
     protected static final Logger LOGGER = 
LoggerFactory.getLogger(MultiNodeTest.class);
@@ -633,6 +629,10 @@ public class MultiNodeTest extends QpidB
         }
     }
 
+    /**
+     * Tests aims to demonstrate that in a disaster situation (where all nodes 
except the master is lost), that operation
+     * can be continued from a single node using the QUORUM_OVERRIDE feature.
+     */
     public void testQuorumOverride() throws Exception
     {
         final Connection connection = getConnection(_positiveFailoverUrl);
@@ -648,6 +648,9 @@ public class MultiNodeTest extends QpidB
             _groupCreator.stopNode(p);
         }
 
+        // Failover may or may not occur. It depends on the relative timing of 
the internal db-ping and the application of the
+        // QUORUM_OVERRIDE.
+
         Map<String, Object> attributes = 
_groupCreator.getNodeAttributes(activeBrokerPort);
         assertEquals("Broker has unexpected quorum override", new Integer(0), 
attributes.get(BDBHAVirtualHostNode.QUORUM_OVERRIDE));
         _groupCreator.setNodeAttributes(activeBrokerPort, Collections.<String, 
Object>singletonMap(BDBHAVirtualHostNode.QUORUM_OVERRIDE, 1));
@@ -655,6 +658,9 @@ public class MultiNodeTest extends QpidB
         attributes = _groupCreator.getNodeAttributes(activeBrokerPort);
         assertEquals("Broker has unexpected quorum override", new Integer(1), 
attributes.get(BDBHAVirtualHostNode.QUORUM_OVERRIDE));
 
+        // Be certain the failover isn't going to occur, or has completed, by 
awaiting the transaction counter to rise
+        awaitNextTransaction(activeBrokerPort);
+
         assertProducingConsuming(connection);
     }
 
@@ -764,6 +770,28 @@ public class MultiNodeTest extends QpidB
         }
     }
 
+    private void awaitNextTransaction(final int brokerPort) throws Exception
+    {
+        Map<String, Object> attributes = 
_groupCreator.getNodeAttributes(brokerPort);
+        final int originalTransactionId = (int) 
attributes.get(BDBHAVirtualHostNode.LAST_KNOWN_REPLICATION_TRANSACTION_ID);
+        int currentTransactionId = 0;
+        long timeout = System.currentTimeMillis() + 60000;
+        LOGGER.debug("Awaiting next transaction. Original transaction id {}", 
originalTransactionId);
+        do
+        {
+            Thread.sleep(250);
+            attributes = _groupCreator.getNodeAttributes(brokerPort);
+            currentTransactionId = (int) 
attributes.get(BDBHAVirtualHostNode.LAST_KNOWN_REPLICATION_TRANSACTION_ID);
+            LOGGER.debug("Current transaction id {}", currentTransactionId);
+        }
+        while (originalTransactionId >= currentTransactionId && timeout > 
System.currentTimeMillis());
+
+        assertTrue("Group transaction has not occurred within timeout."
+                   + "Current transaction id " + currentTransactionId
+                   + "Original transaction id " + originalTransactionId,
+                   currentTransactionId > originalTransactionId);
+    }
+
     private final class FailoverAwaitingListener implements ConnectionListener
     {
         private final CountDownLatch _failoverCompletionLatch;

Modified: 
qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java?rev=1731073&r1=1731072&r2=1731073&view=diff
==============================================================================
--- 
qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
 (original)
+++ 
qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
 Thu Feb 18 13:37:31 2016
@@ -500,6 +500,10 @@ public class QpidBrokerTestCase extends
         return null;
     }
 
+    /**
+     * Tests that a connection is functional by producing and consuming a 
single message.
+     * Will fail if failover interrupts either transaction.
+     */
     public void assertProducingConsuming(final Connection connection) throws 
Exception
     {
         Session session = connection.createSession(true, 
Session.SESSION_TRANSACTED);



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

Reply via email to