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

hanm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new 9f2e2f2  ZOOKEEPER-3537: Leader election - Use of out of election 
messages
9f2e2f2 is described below

commit 9f2e2f238c4bcbb0170bb6a983ffa4e92f701488
Author: Karolos Antoniadis <karo...@gmail.com>
AuthorDate: Mon Sep 30 14:22:31 2019 -0700

    ZOOKEEPER-3537: Leader election - Use of out of election messages
    
    Just a small change. Check leader in `recvset` when consider notifications 
from the same election, and not from `outofelection`.
    
    Parameter `n.state` is needed when creating the new `Vote` because 
otherwise the vote will be in a `LOOKING` state and hence `checkLeader` will 
fail when checking whether the leader is 
[`LEADING`](https://github.com/apache/zookeeper/blob/master/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/FastLeaderElection.java#L793).
    
    Author: Karolos Antoniadis <karo...@gmail.com>
    
    Reviewers: Allan Lyu <fang...@apache.org>, Michael Han <h...@apache.org>
    
    Closes #1081 from insumity/ZOOKEEPER-3537
---
 .../zookeeper/server/quorum/FastLeaderElection.java   | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/FastLeaderElection.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/FastLeaderElection.java
index 4e010b7..b3657da 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/FastLeaderElection.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/FastLeaderElection.java
@@ -907,8 +907,20 @@ public class FastLeaderElection implements Election {
 
         self.start_fle = Time.currentElapsedTime();
         try {
+            /*
+             * The votes from the current leader election are stored in 
recvset. In other words, a vote v is in recvset
+             * if v.electionEpoch == logicalclock. The current participant 
uses recvset to deduce on whether a majority
+             * of participants has voted for it.
+             */
             Map<Long, Vote> recvset = new HashMap<Long, Vote>();
 
+            /*
+             * The votes from previous leader elections, as well as the votes 
from the current leader election are
+             * stored in outofelection. Note that notifications in a LOOKING 
state are not stored in outofelection.
+             * Only FOLLOWING or LEADING notifications are stored in 
outofelection. The current participant could use
+             * outofelection to learn which participant is the leader if it 
arrives late (i.e., higher logicalclock than
+             * the electionEpoch of the received notifications) in a leader 
election.
+             */
             Map<Long, Vote> outofelection = new HashMap<Long, Vote>();
 
             int notTimeout = minNotificationInterval;
@@ -1032,9 +1044,9 @@ public class FastLeaderElection implements Election {
                          * together.
                          */
                         if (n.electionEpoch == logicalclock.get()) {
-                            recvset.put(n.sid, new Vote(n.leader, n.zxid, 
n.electionEpoch, n.peerEpoch));
+                            recvset.put(n.sid, new Vote(n.leader, n.zxid, 
n.electionEpoch, n.peerEpoch, n.state));
                             voteSet = getVoteTracker(recvset, new 
Vote(n.version, n.leader, n.zxid, n.electionEpoch, n.peerEpoch, n.state));
-                            if (voteSet.hasAllQuorums() && 
checkLeader(outofelection, n.leader, n.electionEpoch)) {
+                            if (voteSet.hasAllQuorums() && 
checkLeader(recvset, n.leader, n.electionEpoch)) {
                                 setPeerState(n.leader, voteSet);
                                 Vote endVote = new Vote(n.leader, n.zxid, 
n.electionEpoch, n.peerEpoch);
                                 leaveInstance(endVote);
@@ -1045,6 +1057,9 @@ public class FastLeaderElection implements Election {
                         /*
                          * Before joining an established ensemble, verify that
                          * a majority are following the same leader.
+                         *
+                         * Note that the outofelection map also stores votes 
from the current leader election.
+                         * See ZOOKEEPER-1732 for more information.
                          */
                         outofelection.put(n.sid, new Vote(n.version, n.leader, 
n.zxid, n.electionEpoch, n.peerEpoch, n.state));
                         voteSet = getVoteTracker(outofelection, new 
Vote(n.version, n.leader, n.zxid, n.electionEpoch, n.peerEpoch, n.state));

Reply via email to