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%2FCandidate.java;h=ecd49012461a7b1ee76f4678c7451a4fa1edbfb1;hb=02bdbc1c781abc0b0b1d12dbfc1a19c316bebb98;hp=8d84590426d89c30585ef900757de4287a485e62;hpb=b725909c696c8d40006a6297dc54a467fddcf6b3;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java index 8d84590426..ecd4901246 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Candidate.java @@ -15,6 +15,7 @@ import org.opendaylight.controller.cluster.raft.RaftState; import org.opendaylight.controller.cluster.raft.internal.messages.ElectionTimeout; import org.opendaylight.controller.cluster.raft.messages.AppendEntries; import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply; +import org.opendaylight.controller.cluster.raft.messages.RaftRPC; import org.opendaylight.controller.cluster.raft.messages.RequestVote; import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply; @@ -84,27 +85,19 @@ public class Candidate extends AbstractRaftActorBehavior { } @Override protected RaftState handleAppendEntries(ActorRef sender, - AppendEntries appendEntries, RaftState suggestedState) { + AppendEntries appendEntries) { - context.getLogger().error("An unexpected AppendEntries received in state " + state()); - - return suggestedState; + return state(); } @Override protected RaftState handleAppendEntriesReply(ActorRef sender, - AppendEntriesReply appendEntriesReply, RaftState suggestedState) { - - // Some peer thinks I was a leader and sent me a reply + AppendEntriesReply appendEntriesReply) { - return suggestedState; + return state(); } @Override protected RaftState handleRequestVoteReply(ActorRef sender, - RequestVoteReply requestVoteReply, RaftState suggestedState) { - if (suggestedState == RaftState.Follower) { - // If base class thinks I should be follower then I am - return suggestedState; - } + RequestVoteReply requestVoteReply) { if (requestVoteReply.isVoteGranted()) { voteCount++; @@ -123,6 +116,18 @@ public class Candidate extends AbstractRaftActorBehavior { @Override public RaftState handleMessage(ActorRef sender, Object message) { + + if (message instanceof RaftRPC) { + RaftRPC rpc = (RaftRPC) message; + // If RPC request or response contains term T > currentTerm: + // set currentTerm = T, convert to follower (§5.1) + // This applies to all RPC messages and responses + if (rpc.getTerm() > context.getTermInformation().getCurrentTerm()) { + context.getTermInformation().updateAndPersist(rpc.getTerm(), null); + return RaftState.Follower; + } + } + if (message instanceof ElectionTimeout) { if (votesRequired == 0) { // If there are no peers then we should be a Leader @@ -148,11 +153,13 @@ public class Candidate extends AbstractRaftActorBehavior { // Increment the election term and vote for self long currentTerm = context.getTermInformation().getCurrentTerm(); - context.getTermInformation().update(currentTerm + 1, context.getId()); + context.getTermInformation().updateAndPersist(currentTerm + 1, context.getId()); context.getLogger().debug("Starting new term " + (currentTerm+1)); // Request for a vote + // TODO: Retry request for vote if replies do not arrive in a reasonable + // amount of time TBD for (ActorSelection peerActor : peerToActor.values()) { peerActor.tell(new RequestVote( context.getTermInformation().getCurrentTerm(),