X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FRaftActorContextImpl.java;h=66059b5d62c1b756517cb691ab53f938b42006b0;hb=288a70d15252b3c5fafd202fe7935563f05da9c8;hp=b86a015f6929aa9acc6eb7c0b152fede241e250a;hpb=ac5bcae15c3c9831f2879ae44c66b39130e3f2fe;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContextImpl.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContextImpl.java index b86a015f69..66059b5d62 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContextImpl.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftActorContextImpl.java @@ -16,11 +16,16 @@ import akka.actor.Props; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Supplier; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.Set; import org.opendaylight.controller.cluster.DataPersistenceProvider; import org.opendaylight.controller.cluster.raft.policy.RaftPolicy; +import org.opendaylight.controller.cluster.raft.ServerConfigurationPayload.ServerInfo; import org.slf4j.Logger; public class RaftActorContextImpl implements RaftActorContext { @@ -45,6 +50,8 @@ public class RaftActorContextImpl implements RaftActorContext { private ConfigParams configParams; + private boolean dynamicServerConfiguration = false; + @VisibleForTesting private Supplier totalMemoryRetriever; @@ -179,6 +186,28 @@ public class RaftActorContextImpl implements RaftActorContext { return peerAddress; } + @Override + public void updatePeerIds(ServerConfigurationPayload serverConfig){ + + Set currentPeers = new HashSet<>(this.getPeerIds()); + for(ServerInfo server: serverConfig.getServerConfig()) { + if(!getId().equals(server.getId())) { + VotingState votingState = server.isVoting() ? VotingState.VOTING: VotingState.NON_VOTING; + if(!currentPeers.contains(server.getId())) { + this.addToPeers(server.getId(), null, votingState); + } else { + this.getPeerInfo(server.getId()).setVotingState(votingState); + currentPeers.remove(server.getId()); + } + } + } + + for(String peerIdToRemove: currentPeers) { + this.removePeer(peerIdToRemove); + } + setDynamicServerConfigurationInUse(); + } + @Override public ConfigParams getConfigParams() { return configParams; } @@ -242,4 +271,29 @@ public class RaftActorContextImpl implements RaftActorContext { public RaftPolicy getRaftPolicy() { return configParams.getRaftPolicy(); } + + @Override + public boolean isDynamicServerConfigurationInUse() { + return dynamicServerConfiguration; + } + + @Override + public void setDynamicServerConfigurationInUse() { + this.dynamicServerConfiguration = true; + } + + @Override + public ServerConfigurationPayload getPeerServerInfo() { + if (!isDynamicServerConfigurationInUse()) { + return null; + } + Collection peers = getPeers(); + List newConfig = new ArrayList<>(peers.size() + 1); + for(PeerInfo peer: peers) { + newConfig.add(new ServerInfo(peer.getId(), peer.isVoting())); + } + + newConfig.add(new ServerInfo(getId(), true)); + return (new ServerConfigurationPayload(newConfig)); + } }