Force install snapshot when follower log is ahead
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / main / java / org / opendaylight / controller / cluster / raft / RaftActorContextImpl.java
index f163c9045a46f916f7fe298e2323d31fa9ebe46c..7c1216940dce623e59967c0c5446f72b398f7e8d 100644 (file)
@@ -69,6 +69,8 @@ public class RaftActorContextImpl implements RaftActorContext {
 
     private RaftActorBehavior currentBehavior;
 
+    private int numVotingPeers = -1;
+
     public RaftActorContextImpl(ActorRef actor, ActorContext context, String id,
             ElectionTerm termInformation, long commitIndex, long lastApplied, Map<String, String> peerAddresses,
             ConfigParams configParams, DataPersistenceProvider persistenceProvider, Logger logger) {
@@ -237,6 +239,7 @@ public class RaftActorContextImpl implements RaftActorContext {
     @Override
     public void addToPeers(String id, String address, VotingState votingState) {
         peerInfoMap.put(id, new PeerInfo(id, address, votingState));
+        numVotingPeers = -1;
     }
 
     @Override
@@ -245,6 +248,7 @@ public class RaftActorContextImpl implements RaftActorContext {
             votingMember = false;
         } else {
             peerInfoMap.remove(name);
+            numVotingPeers = -1;
         }
     }
 
@@ -332,6 +336,20 @@ public class RaftActorContextImpl implements RaftActorContext {
         return votingMember;
     }
 
+    @Override
+    public boolean anyVotingPeers() {
+        if(numVotingPeers < 0) {
+            numVotingPeers = 0;
+            for(PeerInfo info: getPeers()) {
+                if(info.isVoting()) {
+                    numVotingPeers++;
+                }
+            }
+        }
+
+        return numVotingPeers > 0;
+    }
+
     @Override
     public RaftActorBehavior getCurrentBehavior() {
         return currentBehavior;