From 583f6075e842a6a37b83bd01e478aebc70c6af73 Mon Sep 17 00:00:00 2001 From: Moiz Raja Date: Thu, 10 Jul 2014 18:37:22 -0700 Subject: [PATCH] Implement behavior common to a RaftActor in all it's states The common behavior for a RaftActor is - Change state to follower when it receives a RaftRPC with a newer term - Increment the applied state of the commitIndex of the AppendEntries message is higher than it's applied state Change-Id: I1fc0cdcb90368f3c07f555b307ac827286386651 Signed-off-by: Moiz Raja --- .../controller/cluster/raft/ElectionTerm.java | 2 +- .../cluster/raft/ElectionTermImpl.java | 4 +- .../behaviors/AbstractRaftActorBehavior.java | 130 +++++++++++++++++- .../cluster/raft/behaviors/Candidate.java | 30 +++- .../cluster/raft/behaviors/Follower.java | 38 ++++- .../cluster/raft/behaviors/Leader.java | 32 ++++- .../raft/messages/AbstractRaftRPC.java | 24 ++++ .../cluster/raft/messages/AppendEntries.java | 21 +-- .../raft/messages/AppendEntriesReply.java | 6 +- .../cluster/raft/messages/RaftRPC.java | 13 ++ .../cluster/raft/messages/RequestVote.java | 7 +- .../raft/messages/RequestVoteReply.java | 7 +- .../cluster/raft/MockRaftActorContext.java | 14 +- .../AbstractRaftActorBehaviorTest.java | 91 ++++++++++++ .../cluster/raft/behaviors/CandidateTest.java | 12 ++ .../cluster/raft/behaviors/FollowerTest.java | 9 ++ .../cluster/raft/behaviors/LeaderTest.java | 8 +- 17 files changed, 412 insertions(+), 36 deletions(-) create mode 100644 opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/AbstractRaftRPC.java create mode 100644 opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/RaftRPC.java create mode 100644 opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehaviorTest.java create mode 100644 opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/CandidateTest.java create mode 100644 opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/FollowerTest.java diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ElectionTerm.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ElectionTerm.java index 2cf39b59f1..4b0367f0ad 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ElectionTerm.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ElectionTerm.java @@ -39,5 +39,5 @@ public interface ElectionTerm { * @param currentTerm * @param votedFor */ - void update(AtomicLong currentTerm, String votedFor); + void update(long currentTerm, String votedFor); } diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ElectionTermImpl.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ElectionTermImpl.java index e918f75273..e75e0c5bb6 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ElectionTermImpl.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/ElectionTermImpl.java @@ -38,8 +38,8 @@ public class ElectionTermImpl implements ElectionTerm{ return votedFor; } - public void update(AtomicLong currentTerm, String votedFor){ - this.currentTerm = currentTerm; + public void update(long currentTerm, String votedFor){ + this.currentTerm.set(currentTerm); this.votedFor = votedFor; // TODO : Write to some persistent state 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 fde104223b..d7a8d5abb3 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 @@ -8,11 +8,18 @@ package org.opendaylight.controller.cluster.raft.behaviors; +import akka.actor.ActorRef; import org.opendaylight.controller.cluster.raft.RaftActorContext; +import org.opendaylight.controller.cluster.raft.RaftState; +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; /** * Abstract class that represents the behavior of a RaftActor - *

+ *

* All Servers: *