49 lines
2.1 KiB
Python
49 lines
2.1 KiB
Python
import MyRaft.state as state
|
|
import MyRaft.leader as leader
|
|
# import MyRaft.follower as follower
|
|
import MyRaft.node as node
|
|
import MyRaft.raft_pb2 as raft_pb2
|
|
|
|
class Candidate(state.State):
|
|
def __init__(self, context:node.RaftNode, majority = 2):
|
|
state.State.__init__(self, context)
|
|
print("We're a candidate!")
|
|
context.currentTerm += 1
|
|
self._votes_received = [] # List of voters who have voted.
|
|
self._votes_received.append(self._context._id)
|
|
self._majority = majority
|
|
self._context.set_timeout(self._context._min_timout, self._context._vary_timeout)
|
|
print("Sending RequestVote to other nodes")
|
|
self._context.send_RequestVote()
|
|
|
|
def rcv_vote(self, request):
|
|
print("Received Vote")
|
|
# Checks the term...
|
|
if not request.voteGranted:
|
|
print("They rejected us!")
|
|
if request.voterId not in self._votes_received:
|
|
print("Added a vote!")
|
|
self._votes_received.append(request.voterId)
|
|
if len(self._votes_received) >= self._majority:
|
|
self._context.set_state(leader.Leader(self._context))
|
|
|
|
def heartbeat_elapsed(self):
|
|
# Start a new election.
|
|
self._context.currentTerm += 1
|
|
self._context.set_timeout(self._context._min_timout, self._context._vary_timeout)
|
|
print("Sending RequestVote to other nodes")
|
|
self._context.send_RequestVote()
|
|
|
|
def rcv_AppendEntries(self, request):
|
|
if request.term >= self._context.currentTerm:
|
|
self._context.set_state(follower.Follower(self._context))
|
|
|
|
def rcv_RequestVote(self, request):
|
|
print("Received a vote request")
|
|
if request.term > self._context.currentTerm:
|
|
print("They're more important, going back to a follower")
|
|
self._context.set_state(follower.Follower(self._context))
|
|
self._context.votedFor = request.candidateId
|
|
return raft_pb2.RequestVoteResponse(term = self._context.currentTerm,
|
|
voteGranted = True,
|
|
voterId = self._context._id) |