You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by sy...@apache.org on 2022/05/17 10:58:05 UTC

[zookeeper] 01/05: ZOOKEEPER-4270: Flaky test: QuorumPeerMainTest#testLeaderOutOfView

This is an automated email from the ASF dual-hosted git repository.

symat pushed a commit to branch branch-3.5
in repository https://gitbox.apache.org/repos/asf/zookeeper.git

commit 6f212fb049a28e450edbf5720626564a6bc01efc
Author: Mohammad Arshad <ar...@apache.org>
AuthorDate: Tue Mar 30 16:59:19 2021 +0530

    ZOOKEEPER-4270: Flaky test: QuorumPeerMainTest#testLeaderOutOfView
    
    The test case is expecting node3 to be leader but node2 sometimes becomes leader. This happens because leader election completes between node1 and node2 which is valid.
    Changed the expectations when node2 is leader otherwise kept the same expectations
    
    Author: Mohammad Arshad <ar...@apache.org>
    
    Reviewers: Enrico Olivelli <eo...@apache.org>
    
    Closes #1665 from arshadmohammad/ZOOKEEPER-4270-branch-3.6
    
    (cherry picked from commit 72facc3b54ddcaedc4693c01fb74474f26f262cb)
---
 .../server/quorum/QuorumPeerMainTest.java          | 34 ++++++++++++++++++----
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java
index aef5bd417..4a90f38f6 100644
--- a/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java
+++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerMainTest.java
@@ -971,11 +971,27 @@ public class QuorumPeerMainTest extends QuorumPeerTestBase {
                 Assert.assertTrue("waiting for server to start",
                         ClientBase.waitForServerUp("127.0.0.1:" + svrs.clientPorts[i], CONNECTION_TIMEOUT));
             }
+            // Expecting that only 3 node will be leader is wrong, even 2 node can be leader, when cluster is formed with 1 node
+            boolean firstAndSecondNodeFormedCluster = false;
+            if (QuorumPeer.ServerState.LEADING == svrs.mt[1].getQuorumPeer().getPeerState()) {
+                Assert.assertEquals(QuorumPeer.ServerState.FOLLOWING,
+                    svrs.mt[0].getQuorumPeer().getPeerState());
+                Assert.assertEquals(QuorumPeer.ServerState.FOLLOWING,
+                    svrs.mt[highestServerIndex].getQuorumPeer().getPeerState());
+                firstAndSecondNodeFormedCluster = true;
+            } else {
+                // Verify leader out of view scenario
+                Assert.assertEquals(QuorumPeer.ServerState.LOOKING,
+                    svrs.mt[0].getQuorumPeer().getPeerState());
+                Assert.assertEquals(QuorumPeer.ServerState.LEADING,
+                    svrs.mt[highestServerIndex].getQuorumPeer().getPeerState());
+            }
 
-            Assert.assertTrue(svrs.mt[0].getQuorumPeer().getPeerState() == QuorumPeer.ServerState.LOOKING);
-            Assert.assertTrue(svrs.mt[highestServerIndex].getQuorumPeer().getPeerState() == QuorumPeer.ServerState.LEADING);
             for (int i = 1; i < highestServerIndex; i++) {
-                Assert.assertTrue(svrs.mt[i].getQuorumPeer().getPeerState() == QuorumPeer.ServerState.FOLLOWING);
+                Assert.assertTrue(
+                    svrs.mt[i].getQuorumPeer().getPeerState() == QuorumPeer.ServerState.FOLLOWING
+                        || svrs.mt[i].getQuorumPeer().getPeerState()
+                        == QuorumPeer.ServerState.LEADING);
             }
 
             // Look through the logs for output that indicates Node 1 is LEADING or FOLLOWING
@@ -989,12 +1005,18 @@ public class QuorumPeerMainTest extends QuorumPeerTestBase {
                 foundFollowing = following.matcher(line).matches();
             }
 
+            if (firstAndSecondNodeFormedCluster) {
+                Assert.assertTrue(
+                    "Corrupt peer should join quorum with servers having same server configuration",
+                    foundFollowing);
+            } else {
+                Assert.assertFalse("Corrupt peer should never become leader", foundLeading);
+                Assert.assertFalse("Corrupt peer should not attempt connection to out of view leader",
+                    foundFollowing);
+            }
         } finally {
             qlogger.removeAppender(appender);
         }
-
-        Assert.assertFalse("Corrupt peer should never become leader", foundLeading);
-        Assert.assertFalse("Corrupt peer should not attempt connection to out of view leader", foundFollowing);
     }
 
     @Test