import akka.actor.ActorRef;
import akka.actor.ActorSelection;
+import java.util.ArrayList;
import java.util.Collection;
+import org.opendaylight.controller.cluster.raft.PeerInfo;
import org.opendaylight.controller.cluster.raft.RaftActorContext;
import org.opendaylight.controller.cluster.raft.RaftState;
import org.opendaylight.controller.cluster.raft.base.messages.ElectionTimeout;
private final int votesRequired;
- private final Collection<String> peers;
+ private final Collection<String> votingPeers = new ArrayList<>();
public Candidate(RaftActorContext context) {
super(context, RaftState.Candidate);
- peers = context.getPeerIds();
+ for(PeerInfo peer: context.getPeers()) {
+ if(peer.isVoting()) {
+ votingPeers.add(peer.getId());
+ }
+ }
if(LOG.isDebugEnabled()) {
- LOG.debug("{}: Election: Candidate has following peers: {}", logName(), peers);
+ LOG.debug("{}: Election: Candidate has following voting peers: {}", logName(), votingPeers);
}
- votesRequired = getMajorityVoteCount(peers.size());
+ votesRequired = getMajorityVoteCount(votingPeers.size());
startNewTerm();
- if(peers.isEmpty()){
+ if(votingPeers.isEmpty()){
actor().tell(ELECTION_TIMEOUT, actor());
} else {
scheduleElection(electionDuration());
// Request for a vote
// TODO: Retry request for vote if replies do not arrive in a reasonable
// amount of time TBD
- for (String peerId : peers) {
+ for (String peerId : votingPeers) {
ActorSelection peerActor = context.getPeerActorSelection(peerId);
if(peerActor != null) {
RequestVote requestVote = new RequestVote(