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%2FAbstractRaftActorBehavior.java;h=087c656b1836daaf9c05ac7b91e32eba1057c02c;hp=80ed698d6cdcfae29120c7d93e92f8283f9ae81d;hb=refs%2Fchanges%2F09%2F83009%2F6;hpb=913ae866cd0cc82991e1f66ac80f6a42b0daaa48 diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java index 80ed698d6c..087c656b18 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java @@ -11,6 +11,7 @@ package org.opendaylight.controller.cluster.raft.behaviors; import akka.actor.ActorRef; import akka.actor.Cancellable; import com.google.common.base.Preconditions; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Random; import java.util.concurrent.TimeUnit; import org.opendaylight.controller.cluster.raft.ClientRequestTracker; @@ -39,6 +40,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { /** * Used for message logging. */ + @SuppressFBWarnings("SLF4J_LOGGER_SHOULD_BE_PRIVATE") protected final Logger log; /** @@ -96,7 +98,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { } @Override - public void setReplicatedToAllIndex(long replicatedToAllIndex) { + public void setReplicatedToAllIndex(final long replicatedToAllIndex) { this.replicatedToAllIndex = replicatedToAllIndex; } @@ -127,15 +129,15 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { * @param appendEntries the message * @return a new behavior if it was changed or the current behavior */ - protected RaftActorBehavior appendEntries(ActorRef sender, AppendEntries appendEntries) { + protected RaftActorBehavior appendEntries(final ActorRef sender, final AppendEntries appendEntries) { // 1. Reply false if term < currentTerm (§5.1) if (appendEntries.getTerm() < currentTerm()) { - log.debug("{}: Cannot append entries because sender term {} is less than {}", logName(), + log.info("{}: Cannot append entries because sender's term {} is less than {}", logName(), appendEntries.getTerm(), currentTerm()); sender.tell(new AppendEntriesReply(context.getId(), currentTerm(), false, lastIndex(), lastTerm(), - context.getPayloadVersion()), actor()); + context.getPayloadVersion(), false, false, appendEntries.getLeaderRaftVersion()), actor()); return this; } @@ -165,9 +167,10 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { * @param requestVote the message * @return a new behavior if it was changed or the current behavior */ - protected RaftActorBehavior requestVote(ActorRef sender, RequestVote requestVote) { + protected RaftActorBehavior requestVote(final ActorRef sender, final RequestVote requestVote) { - log.debug("{}: In requestVote: {}", logName(), requestVote); + log.debug("{}: In requestVote: {} - currentTerm: {}, votedFor: {}, lastIndex: {}, lastTerm: {}", logName(), + requestVote, currentTerm(), votedFor(), lastIndex(), lastTerm()); boolean grantVote = canGrantVote(requestVote); @@ -184,7 +187,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { return this; } - protected boolean canGrantVote(RequestVote requestVote) { + protected boolean canGrantVote(final RequestVote requestVote) { boolean grantVote = false; // Reply false if term < currentTerm (§5.1) @@ -263,7 +266,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { * * @param interval the duration after which we should trigger a new election */ - protected void scheduleElection(FiniteDuration interval) { + protected void scheduleElection(final FiniteDuration interval) { stopElection(); // Schedule an election. When the scheduler triggers an ElectionTimeout message is sent to itself @@ -321,7 +324,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { * @param logIndex the log index * @return the ClientRequestTracker or null if none available */ - protected ClientRequestTracker removeClientRequestTracker(long logIndex) { + protected ClientRequestTracker removeClientRequestTracker(final long logIndex) { return null; } @@ -330,7 +333,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { * * @return the log entry index or -1 if not found */ - protected long getLogEntryIndex(long index) { + protected long getLogEntryIndex(final long index) { if (index == context.getReplicatedLog().getSnapshotIndex()) { return context.getReplicatedLog().getSnapshotIndex(); } @@ -344,11 +347,11 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { } /** - * Returns the actual term of the entry in replicated log for the given index or -1 if not found. + * Returns the actual term of the entry in the replicated log for the given index or -1 if not found. * * @return the log entry term or -1 if not found */ - protected long getLogEntryTerm(long index) { + protected long getLogEntryTerm(final long index) { if (index == context.getReplicatedLog().getSnapshotIndex()) { return context.getReplicatedLog().getSnapshotTerm(); } @@ -361,6 +364,20 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { return -1; } + /** + * Returns the actual term of the entry in the replicated log for the given index or, if not present, returns the + * snapshot term if the given index is in the snapshot or -1 otherwise. + * + * @return the term or -1 otherwise + */ + protected long getLogEntryOrSnapshotTerm(final long index) { + if (context.getReplicatedLog().isInSnapshot(index)) { + return context.getReplicatedLog().getSnapshotTerm(); + } + + return getLogEntryTerm(index); + } + /** * Applies the log entries up to the specified index that is known to be committed to the state machine. * @@ -404,7 +421,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { } @Override - public RaftActorBehavior handleMessage(ActorRef sender, Object message) { + public RaftActorBehavior handleMessage(final ActorRef sender, final Object message) { if (message instanceof AppendEntries) { return appendEntries(sender, (AppendEntries) message); } else if (message instanceof AppendEntriesReply) { @@ -419,21 +436,22 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { } @Override - public RaftActorBehavior switchBehavior(RaftActorBehavior behavior) { + public RaftActorBehavior switchBehavior(final RaftActorBehavior behavior) { return internalSwitchBehavior(behavior); } - protected RaftActorBehavior internalSwitchBehavior(RaftState newState) { + protected RaftActorBehavior internalSwitchBehavior(final RaftState newState) { return internalSwitchBehavior(createBehavior(context, newState)); } @SuppressWarnings("checkstyle:IllegalCatch") - protected RaftActorBehavior internalSwitchBehavior(RaftActorBehavior newBehavior) { + protected RaftActorBehavior internalSwitchBehavior(final RaftActorBehavior newBehavior) { if (!context.getRaftPolicy().automaticElectionsEnabled()) { return this; } - log.info("{} :- Switching from behavior {} to {}", logName(), this.state(), newBehavior.state()); + log.info("{} :- Switching from behavior {} to {}, election term: {}", logName(), this.state(), + newBehavior.state(), context.getTermInformation().getCurrentTerm()); try { close(); } catch (RuntimeException e) { @@ -443,7 +461,7 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior { } - protected int getMajorityVoteCount(int numPeers) { + protected int getMajorityVoteCount(final int numPeers) { // Votes are required from a majority of the peers including self. // The numMajority field therefore stores a calculated value // of the number of votes required for this candidate to win an