You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ar...@apache.org on 2021/03/30 11:24:55 UTC

[zookeeper] branch branch-3.7 updated: ZOOKEEPER-4270: Flaky test: QuorumPeerMainTest#testLeaderOutOfView

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

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


The following commit(s) were added to refs/heads/branch-3.7 by this push:
     new c517b04  ZOOKEEPER-4270: Flaky test: QuorumPeerMainTest#testLeaderOutOfView
c517b04 is described below

commit c517b04f90b76596da59fcc61b8d18cfc312260a
Author: Mohammad Arshad <ar...@apache.org>
AuthorDate: Tue Mar 30 16:56:40 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 #1666 from arshadmohammad/ZOOKEEPER-4270-master
    
    (cherry picked from commit 3961bcc7d6eabfe0723c9dab653d9bb83da7f8f8)
    Signed-off-by: Mohammad Arshad <ar...@apache.org>
---
 .../server/quorum/QuorumPeerMainTest.java          | 34 +++++++++++++++++-----
 1 file changed, 27 insertions(+), 7 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 bc00d21..724356e 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
@@ -903,11 +903,26 @@ public class QuorumPeerMainTest extends QuorumPeerTestBase {
                         "waiting for server to start");
             }
 
-            assertTrue(svrs.mt[0].getQuorumPeer().getPeerState() == QuorumPeer.ServerState.LOOKING);
-            assertTrue(svrs.mt[highestServerIndex].getQuorumPeer().getPeerState()
-                                      == QuorumPeer.ServerState.LEADING);
+            // 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()) {
+                assertEquals(QuorumPeer.ServerState.FOLLOWING,
+                    svrs.mt[0].getQuorumPeer().getPeerState());
+                assertEquals(QuorumPeer.ServerState.FOLLOWING,
+                    svrs.mt[highestServerIndex].getQuorumPeer().getPeerState());
+                firstAndSecondNodeFormedCluster = true;
+            } else {
+                // Verify leader out of view scenario
+                assertEquals(QuorumPeer.ServerState.LOOKING,
+                    svrs.mt[0].getQuorumPeer().getPeerState());
+                assertEquals(QuorumPeer.ServerState.LEADING,
+                    svrs.mt[highestServerIndex].getQuorumPeer().getPeerState());
+            }
             for (int i = 1; i < highestServerIndex; i++) {
-                assertTrue(svrs.mt[i].getQuorumPeer().getPeerState() == QuorumPeer.ServerState.FOLLOWING);
+                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
@@ -920,13 +935,18 @@ public class QuorumPeerMainTest extends QuorumPeerTestBase {
                 foundLeading = leading.matcher(line).matches();
                 foundFollowing = following.matcher(line).matches();
             }
+            if (firstAndSecondNodeFormedCluster) {
+                assertTrue(foundFollowing,
+                    "Corrupt peer should join quorum with servers having same server configuration");
+            } else {
+                assertFalse(foundLeading, "Corrupt peer should never become leader");
+                assertFalse(foundFollowing,
+                    "Corrupt peer should not attempt connection to out of view leader");
+            }
 
         } finally {
             qlogger.removeAppender(appender);
         }
-
-        assertFalse(foundLeading, "Corrupt peer should never become leader");
-        assertFalse(foundFollowing, "Corrupt peer should not attempt connection to out of view leader");
     }
 
     @Test