import org.opendaylight.controller.cluster.raft.RaftActorContext;
import org.opendaylight.controller.cluster.raft.RaftState;
import org.opendaylight.controller.cluster.raft.ReplicatedLogEntry;
-import org.opendaylight.controller.cluster.raft.SerializationUtils;
-import org.opendaylight.controller.cluster.raft.base.messages.ApplyJournalEntries;
import org.opendaylight.controller.cluster.raft.base.messages.ApplyState;
import org.opendaylight.controller.cluster.raft.base.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.RequestVote;
import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply;
+import org.opendaylight.controller.cluster.raft.persisted.ApplyJournalEntries;
import org.slf4j.Logger;
import scala.concurrent.duration.FiniteDuration;
return new IsolatedLeader(context);
case Leader:
return new Leader(context);
+ case PreLeader:
+ return new PreLeader(context);
default:
throw new IllegalArgumentException("Unhandled state " + state);
}
/**
*
- * @return log index from the previous to last entry in the log
+ * @return the log entry index for the given index or -1 if not found
*/
- protected long prevLogIndex(long index){
- ReplicatedLogEntry prevEntry =
- context.getReplicatedLog().get(index - 1);
- if (prevEntry != null) {
- return prevEntry.getIndex();
+ protected long getLogEntryIndex(long index){
+ if(index == context.getReplicatedLog().getSnapshotIndex()){
+ return context.getReplicatedLog().getSnapshotIndex();
}
+
+ ReplicatedLogEntry entry = context.getReplicatedLog().get(index);
+ if(entry != null){
+ return entry.getIndex();
+ }
+
return -1;
}
/**
- * @return log term from the previous to last entry in the log
+ * @return the log entry term for the given index or -1 if not found
*/
- protected long prevLogTerm(long index){
- ReplicatedLogEntry prevEntry =
- context.getReplicatedLog().get(index - 1);
- if (prevEntry != null) {
- return prevEntry.getTerm();
+ protected long getLogEntryTerm(long index){
+ if(index == context.getReplicatedLog().getSnapshotIndex()){
+ return context.getReplicatedLog().getSnapshotTerm();
}
+
+ ReplicatedLogEntry entry = context.getReplicatedLog().get(index);
+ if(entry != null){
+ return entry.getTerm();
+ }
+
return -1;
}
actor().tell(new ApplyJournalEntries(context.getLastApplied()), actor());
}
- protected Object fromSerializableMessage(Object serializable){
- return SerializationUtils.fromSerializable(serializable);
- }
-
@Override
public RaftActorBehavior handleMessage(ActorRef sender, Object message) {
if (message instanceof AppendEntries) {
}
protected RaftActorBehavior internalSwitchBehavior(RaftState newState) {
- if(context.getRaftPolicy().automaticElectionsEnabled()){
- return internalSwitchBehavior(createBehavior(context, newState));
- }
- return this;
+ return internalSwitchBehavior(createBehavior(context, newState));
}
- private RaftActorBehavior internalSwitchBehavior(RaftActorBehavior newBehavior) {
+ protected RaftActorBehavior internalSwitchBehavior(RaftActorBehavior newBehavior) {
+ if(!context.getRaftPolicy().automaticElectionsEnabled()) {
+ return this;
+ }
+
LOG.info("{} :- Switching from behavior {} to {}", logName(), this.state(), newBehavior.state());
try {
close();