import akka.actor.ActorSelection;
import akka.actor.ActorSystem;
import akka.actor.Props;
+import akka.cluster.Cluster;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import java.util.function.LongSupplier;
import org.opendaylight.controller.cluster.DataPersistenceProvider;
-import org.opendaylight.controller.cluster.raft.ServerConfigurationPayload.ServerInfo;
import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
+import org.opendaylight.controller.cluster.raft.persisted.ServerConfigurationPayload;
+import org.opendaylight.controller.cluster.raft.persisted.ServerInfo;
import org.opendaylight.controller.cluster.raft.policy.RaftPolicy;
import org.slf4j.Logger;
private RaftActorBehavior currentBehavior;
+ private int numVotingPeers = -1;
+
+ private Optional<Cluster> cluster;
+
public RaftActorContextImpl(ActorRef actor, ActorContext context, String id,
ElectionTerm termInformation, long commitIndex, long lastApplied, Map<String, String> peerAddresses,
ConfigParams configParams, DataPersistenceProvider persistenceProvider, Logger logger) {
return actor;
}
+ @Override
+ public Optional<Cluster> getCluster() {
+ if(cluster == null) {
+ try {
+ cluster = Optional.of(Cluster.get(getActorSystem()));
+ } catch(Exception e) {
+ // An exception means there's no cluster configured. This will only happen in unit tests.
+ LOG.debug("{}: Could not obtain Cluster: {}", getId(), e);
+ cluster = Optional.empty();
+ }
+ }
+
+ return cluster;
+ }
+
@Override
public ElectionTerm getTermInformation() {
return termInformation;
votingMember = false;
}
+ LOG.debug("{}: Updated server config: isVoting: {}, peers: {}", id, votingMember, peerInfoMap.values());
+
setDynamicServerConfigurationInUse();
}
@Override
public void addToPeers(String id, String address, VotingState votingState) {
peerInfoMap.put(id, new PeerInfo(id, address, votingState));
+ numVotingPeers = -1;
}
@Override
votingMember = false;
} else {
peerInfoMap.remove(name);
+ numVotingPeers = -1;
}
}
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;