BUG 2773 : Transition Shard to Leader state when it has no peers
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / main / java / org / opendaylight / controller / cluster / raft / behaviors / Follower.java
index 618865cb88eb8877cdcfdcfb29208c80707c2c0f..a1174d70dcfd40d4272f3ef664bc8ed3c78d6868 100644 (file)
@@ -46,9 +46,14 @@ public class Follower extends AbstractRaftActorBehavior {
     public Follower(RaftActorContext context) {
         super(context, RaftState.Follower);
 
-        scheduleElection(electionDuration());
-
         initialSyncStatusTracker = new InitialSyncStatusTracker(context.getActor());
+
+        if(context.getPeerAddresses().isEmpty()){
+            actor().tell(ELECTION_TIMEOUT, actor());
+        } else {
+            scheduleElection(electionDuration());
+        }
+
     }
 
     private boolean isLogEntryPresent(long index){
@@ -96,6 +101,19 @@ public class Follower extends AbstractRaftActorBehavior {
         // to make it easier to read. Before refactoring ensure tests
         // cover the code properly
 
+        if (snapshotTracker != null) {
+            // if snapshot install is in progress, follower should just acknowledge append entries with a reply.
+            AppendEntriesReply reply = new AppendEntriesReply(context.getId(), currentTerm(), true,
+                    lastIndex(), lastTerm());
+
+            if(LOG.isDebugEnabled()) {
+                LOG.debug("{}: snapshot install is in progress, replying immediately with {}", logName(), reply);
+            }
+            sender.tell(reply, actor());
+
+            return this;
+        }
+
         // 1. Reply false if term < currentTerm (ยง5.1)
         // This is handled in the appendEntries method of the base class
 
@@ -352,7 +370,7 @@ public class Follower extends AbstractRaftActorBehavior {
         return snapshotTracker;
     }
 
-    private static class InitialSyncStatusTracker {
+    private class InitialSyncStatusTracker {
 
         private static final long INVALID_LOG_INDEX = -2L;
         private long initialLeaderCommit = INVALID_LOG_INDEX;
@@ -374,10 +392,10 @@ public class Follower extends AbstractRaftActorBehavior {
 
             if(!initialSyncUpDone){
                 if(initialLeaderCommit == INVALID_LOG_INDEX){
-                    actor.tell(new FollowerInitialSyncUpStatus(false), ActorRef.noSender());
+                    actor.tell(new FollowerInitialSyncUpStatus(false, getId()), ActorRef.noSender());
                     initialLeaderCommit = leaderCommit;
                 } else if(commitIndex >= initialLeaderCommit){
-                    actor.tell(new FollowerInitialSyncUpStatus(true), ActorRef.noSender());
+                    actor.tell(new FollowerInitialSyncUpStatus(true, getId()), ActorRef.noSender());
                     initialSyncUpDone = true;
                 }
             }