Browse Source

ZOOKEEPER-3117: Correct the LeaderBean.followerInfo to only return the followers list

Author: Fangmin Lyu <allenlyu@fb.com>

Reviewers: andor@apache.org

Closes #595 from lvfangmin/ZOOKEEPER-3117
Fangmin Lyu 6 years ago
parent
commit
290f1fc4b9

+ 1 - 1
src/java/main/org/apache/zookeeper/server/admin/Commands.java

@@ -337,7 +337,7 @@ public class Commands {
             if (zkServer instanceof LeaderZooKeeperServer) {
                 Leader leader = ((LeaderZooKeeperServer) zkServer).getLeader();
 
-                response.put("followers", leader.getLearners().size());
+                response.put("learners", leader.getLearners().size());
                 response.put("synced_followers", leader.getForwardingFollowers().size());
                 response.put("pending_syncs", leader.getNumPendingSyncs());
 

+ 1 - 1
src/java/main/org/apache/zookeeper/server/command/MonitorCommand.java

@@ -71,7 +71,7 @@ public class MonitorCommand extends AbstractFourLetterCommand {
         if (stats.getServerState().equals("leader")) {
             Leader leader = ((LeaderZooKeeperServer)zkServer).getLeader();
 
-            print("followers", leader.getLearners().size());
+            print("learners", leader.getLearners().size());
             print("synced_followers", leader.getForwardingFollowers().size());
             print("pending_syncs", leader.getNumPendingSyncs());
 

+ 1 - 1
src/java/main/org/apache/zookeeper/server/quorum/Leader.java

@@ -100,7 +100,7 @@ public class Leader {
     // the follower acceptor thread
     volatile LearnerCnxAcceptor cnxAcceptor = null;
 
-    // list of all the followers
+    // list of all the learners, including followers and observers
     private final HashSet<LearnerHandler> learners =
         new HashSet<LearnerHandler>();
 

+ 7 - 4
src/java/main/org/apache/zookeeper/server/quorum/LeaderBean.java

@@ -20,18 +20,19 @@ package org.apache.zookeeper.server.quorum;
 
 import org.apache.zookeeper.server.ZooKeeperServerBean;
 import org.apache.zookeeper.server.ZooKeeperServer;
+import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType;
 
 /**
  * Leader MBean interface implementation.
  */
 public class LeaderBean extends ZooKeeperServerBean implements LeaderMXBean {
     private final Leader leader;
-    
+
     public LeaderBean(Leader leader, ZooKeeperServer zks) {
         super(zks);
         this.leader = leader;
     }
-    
+
     public String getName() {
         return "Leader";
     }
@@ -39,11 +40,13 @@ public class LeaderBean extends ZooKeeperServerBean implements LeaderMXBean {
     public String getCurrentZxid() {
         return "0x" + Long.toHexString(zks.getZxid());
     }
-    
+
     public String followerInfo() {
         StringBuilder sb = new StringBuilder();
         for (LearnerHandler handler : leader.getLearners()) {
-            sb.append(handler.toString()).append("\n");
+            if (handler.getLearnerType() == LearnerType.PARTICIPANT) {
+                sb.append(handler.toString()).append("\n");
+            }
         }
         return sb.toString();
     }

+ 19 - 0
src/java/test/org/apache/zookeeper/server/quorum/LeaderBeanTest.java

@@ -24,6 +24,7 @@ import org.apache.zookeeper.server.Request;
 import org.apache.zookeeper.server.ZKDatabase;
 import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
 import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier;
+import org.apache.zookeeper.server.quorum.QuorumPeer.LearnerType;
 import org.apache.zookeeper.server.util.SerializeUtils;
 import org.apache.zookeeper.test.ClientBase;
 import org.apache.zookeeper.txn.TxnHeader;
@@ -42,6 +43,7 @@ import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public class LeaderBeanTest {
     private Leader leader;
@@ -148,4 +150,21 @@ public class LeaderBeanTest {
         }).when(txn).serialize(any(OutputArchive.class), anyString());
         return new Request(1, 2, 3, header, txn, 4);
     }
+
+    @Test
+    public void testFollowerInfo() throws IOException {
+        LearnerHandler follower = mock(LearnerHandler.class);
+        when(follower.getLearnerType()).thenReturn(LearnerType.PARTICIPANT);
+        when(follower.toString()).thenReturn("1");
+        leader.addLearnerHandler(follower);
+
+        assertEquals("1\n", leaderBean.followerInfo());
+
+        LearnerHandler observer = mock(LearnerHandler.class);
+        when(observer.getLearnerType()).thenReturn(LearnerType.OBSERVER);
+        when(observer.toString()).thenReturn("2");
+        leader.addLearnerHandler(observer);
+
+        assertEquals("1\n", leaderBean.followerInfo());
+    }
 }