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.TimeoutNow;
import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply;
/**
@VisibleForTesting
static final Object ISOLATED_LEADER_CHECK = new Object();
- private final Stopwatch isolatedLeaderCheck;
+ private final Stopwatch isolatedLeaderCheck = Stopwatch.createStarted();
private @Nullable LeadershipTransferContext leadershipTransferContext;
+ Leader(RaftActorContext context, @Nullable AbstractLeader initializeFromLeader) {
+ super(context, RaftState.Leader, initializeFromLeader);
+ }
+
public Leader(RaftActorContext context) {
- super(context);
- isolatedLeaderCheck = Stopwatch.createStarted();
+ this(context, null);
}
- @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 (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
// additional AppendEntries with the latest commit index.
sendAppendEntries(0, false);
- // Now send an ElectionTimeout to the matching follower to immediately start an election.
+ // Now send a TimeoutNow message to the matching follower to immediately start an election.
ActorSelection followerActor = context.getPeerActorSelection(followerId);
- followerActor.tell(ElectionTimeout.INSTANCE, context.getActor());
+ followerActor.tell(TimeoutNow.INSTANCE, context.getActor());
LOG.debug("{}: Leader transfer complete", logName());
}
@Override
- public void close() throws Exception {
+ public void close() {
if(leadershipTransferContext != null) {
- leadershipTransferContext.transferCohort.abortTransfer();
+ LeadershipTransferContext localLeadershipTransferContext = leadershipTransferContext;
+ leadershipTransferContext = null;
+ localLeadershipTransferContext.transferCohort.abortTransfer();
}
super.close();