X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2Fbehaviors%2FLeader.java;h=36e9b646e66f069504e8d220ceafb80bdc0a1b6a;hp=21aad966cb2b7dd375b6e4667e952ab4b85891a9;hb=f276ae33b951d173b51c467bb7bb1a5f5cf9a1e6;hpb=4e000b89c3b5ac555cb1e2c39e999a8633b48a96 diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java index 21aad966cb..36e9b646e6 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java @@ -20,7 +20,6 @@ import org.opendaylight.controller.cluster.raft.RaftActorContext; import org.opendaylight.controller.cluster.raft.RaftActorLeadershipTransferCohort; import org.opendaylight.controller.cluster.raft.RaftState; import org.opendaylight.controller.cluster.raft.base.messages.ElectionTimeout; -import org.opendaylight.controller.cluster.raft.base.messages.IsolatedLeaderCheck; import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply; /** @@ -46,28 +45,35 @@ import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply; * set commitIndex = N (§5.3, §5.4). */ public class Leader extends AbstractLeader { - private static final IsolatedLeaderCheck ISOLATED_LEADER_CHECK = new IsolatedLeaderCheck(); - private final Stopwatch isolatedLeaderCheck; + /** + * Internal message sent to periodically check if this leader has become isolated and should transition + * to {@link IsolatedLeader}. + */ + @VisibleForTesting + static final Object ISOLATED_LEADER_CHECK = new Object(); + + private final Stopwatch isolatedLeaderCheck = Stopwatch.createStarted(); private @Nullable LeadershipTransferContext leadershipTransferContext; public Leader(RaftActorContext context) { - super(context); - isolatedLeaderCheck = Stopwatch.createStarted(); + super(context, RaftState.Leader); } - @Override public RaftActorBehavior handleMessage(ActorRef sender, Object originalMessage) { + @Override + public RaftActorBehavior handleMessage(ActorRef sender, Object originalMessage) { Preconditions.checkNotNull(sender, "sender should not be null"); - if (originalMessage instanceof IsolatedLeaderCheck) { + if (ISOLATED_LEADER_CHECK.equals(originalMessage)) { if (isLeaderIsolated()) { LOG.warn("{}: At least {} followers need to be active, Switching {} from Leader to IsolatedLeader", - context.getId(), getMinIsolatedLeaderPeerCount(), leaderId); - + context.getId(), getMinIsolatedLeaderPeerCount(), getLeaderId()); return internalSwitchBehavior(RaftState.IsolatedLeader); + } else { + return this; } + } else { + return super.handleMessage(sender, originalMessage); } - - return super.handleMessage(sender, originalMessage); } @Override @@ -129,11 +135,12 @@ public class Leader extends AbstractLeader { } long lastIndex = context.getReplicatedLog().lastIndex(); + boolean isVoting = context.getPeerInfo(followerId).isVoting(); - LOG.debug("{}: tryToCompleteLeadershipTransfer: followerId: {}, matchIndex: {}, lastIndex: {}", - logName(), followerId, followerInfo.getMatchIndex(), lastIndex); + LOG.debug("{}: tryToCompleteLeadershipTransfer: followerId: {}, matchIndex: {}, lastIndex: {}, isVoting: {}", + logName(), followerId, followerInfo.getMatchIndex(), lastIndex, isVoting); - if(followerInfo.getMatchIndex() == lastIndex) { + if(isVoting && followerInfo.getMatchIndex() == lastIndex) { LOG.debug("{}: Follower's log matches - sending ElectionTimeout", logName()); // We can't be sure if the follower has applied all its log entries to its state so send an @@ -142,7 +149,7 @@ public class Leader extends AbstractLeader { // Now send an ElectionTimeout to the matching follower to immediately start an election. ActorSelection followerActor = context.getPeerActorSelection(followerId); - followerActor.tell(new ElectionTimeout(), context.getActor()); + followerActor.tell(ElectionTimeout.INSTANCE, context.getActor()); LOG.debug("{}: Leader transfer complete", logName()); @@ -152,7 +159,7 @@ public class Leader extends AbstractLeader { } @Override - public void close() throws Exception { + public void close() { if(leadershipTransferContext != null) { leadershipTransferContext.transferCohort.abortTransfer(); }