X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2Fbehaviors%2FLeader.java;h=3534ac5cf142eda058ceb1e39b90d311b096b20b;hb=86e8e4a06b682aa772c834a2cef56d0596540e1b;hp=f5f3f51819be30fdeefb020ebf20100fa7c6cf29;hpb=a81d98f692b80c45bce3fe6a87e731abfb012a9f;p=controller.git 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 f5f3f51819..3534ac5cf1 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 @@ -7,14 +7,16 @@ */ package org.opendaylight.controller.cluster.raft.behaviors; +import static java.util.Objects.requireNonNull; + import akka.actor.ActorRef; import akka.actor.ActorSelection; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; import com.google.common.base.Stopwatch; +import java.util.Optional; import java.util.concurrent.TimeUnit; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.controller.cluster.raft.FollowerLogInformation; import org.opendaylight.controller.cluster.raft.RaftActorContext; import org.opendaylight.controller.cluster.raft.RaftActorLeadershipTransferCohort; @@ -53,19 +55,19 @@ public class Leader extends AbstractLeader { static final Object ISOLATED_LEADER_CHECK = new Object(); private final Stopwatch isolatedLeaderCheck = Stopwatch.createStarted(); - @Nullable private LeadershipTransferContext leadershipTransferContext; + private @Nullable LeadershipTransferContext leadershipTransferContext; - Leader(RaftActorContext context, @Nullable AbstractLeader initializeFromLeader) { + Leader(final RaftActorContext context, @Nullable final AbstractLeader initializeFromLeader) { super(context, RaftState.Leader, initializeFromLeader); } - public Leader(RaftActorContext context) { + public Leader(final RaftActorContext context) { this(context, null); } @Override - public RaftActorBehavior handleMessage(ActorRef sender, Object originalMessage) { - Preconditions.checkNotNull(sender, "sender should not be null"); + public RaftActorBehavior handleMessage(final ActorRef sender, final Object originalMessage) { + requireNonNull(sender, "sender should not be null"); if (ISOLATED_LEADER_CHECK.equals(originalMessage)) { if (isLeaderIsolated()) { @@ -96,7 +98,8 @@ public class Leader extends AbstractLeader { } @Override - protected RaftActorBehavior handleAppendEntriesReply(ActorRef sender, AppendEntriesReply appendEntriesReply) { + protected RaftActorBehavior handleAppendEntriesReply(final ActorRef sender, + final AppendEntriesReply appendEntriesReply) { RaftActorBehavior returnBehavior = super.handleAppendEntriesReply(sender, appendEntriesReply); tryToCompleteLeadershipTransfer(appendEntriesReply.getFollowerId()); return returnBehavior; @@ -120,7 +123,7 @@ public class Leader extends AbstractLeader { * * @param leadershipTransferCohort the cohort participating in the leadership transfer */ - public void transferLeadership(@Nonnull RaftActorLeadershipTransferCohort leadershipTransferCohort) { + public void transferLeadership(@NonNull final RaftActorLeadershipTransferCohort leadershipTransferCohort) { log.debug("{}: Attempting to transfer leadership", logName()); leadershipTransferContext = new LeadershipTransferContext(leadershipTransferCohort); @@ -129,11 +132,18 @@ public class Leader extends AbstractLeader { sendAppendEntries(0, false); } - private void tryToCompleteLeadershipTransfer(String followerId) { + private void tryToCompleteLeadershipTransfer(final String followerId) { if (leadershipTransferContext == null) { return; } + final Optional requestedFollowerIdOptional + = leadershipTransferContext.transferCohort.getRequestedFollowerId(); + if (requestedFollowerIdOptional.isPresent() && !requestedFollowerIdOptional.get().equals(followerId)) { + // we want to transfer leadership to specific follower + return; + } + FollowerLogInformation followerInfo = getFollower(followerId); if (followerInfo == null) { return; @@ -175,12 +185,12 @@ public class Leader extends AbstractLeader { } @VisibleForTesting - void markFollowerActive(String followerId) { + void markFollowerActive(final String followerId) { getFollower(followerId).markFollowerActive(); } @VisibleForTesting - void markFollowerInActive(String followerId) { + void markFollowerInActive(final String followerId) { getFollower(followerId).markFollowerInActive(); } @@ -188,11 +198,11 @@ public class Leader extends AbstractLeader { RaftActorLeadershipTransferCohort transferCohort; Stopwatch timer = Stopwatch.createStarted(); - LeadershipTransferContext(RaftActorLeadershipTransferCohort transferCohort) { + LeadershipTransferContext(final RaftActorLeadershipTransferCohort transferCohort) { this.transferCohort = transferCohort; } - boolean isExpired(long timeout) { + boolean isExpired(final long timeout) { if (timer.elapsed(TimeUnit.MILLISECONDS) >= timeout) { transferCohort.abortTransfer(); return true;