def __init__(self, node_id): threading.Thread.__init__(self) self.node = cluster[node_id] self.node_state = Follower(self.node) self.election_timeout = float( randrange(ELECTION_TIMEOUT_MAX / 2, ELECTION_TIMEOUT_MAX)) self.election_timer = threading.Timer(self.election_timeout, self.become_candidate)
def stepDown(self,message): if(message.term>State.currentTerm and (not StateController.eql(State.state,'follower'))): StateController.setState('follower') #print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Resetting Follower') Follower.reset(message.term) StateController.setTimer() print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Step down...State Switch to Follower') return True else: return False
def become_follower(self): timeout = float( randrange(ELECTION_TIMEOUT_MAX / 2, ELECTION_TIMEOUT_MAX)) if type(self.node_state) != Follower: logging.info(f'{self} become follower ... ') self.node_state = Follower(self.node) logging.info(f'{self} reset election timer {timeout} s ... ') send_state_update(self.node_state, timeout) self.election_timer.cancel() self.election_timer = threading.Timer(timeout, self.become_candidate) self.election_timer.start()
def onTimeout(self): #print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Time out!') if(StateController.eql(State.state,'follower')): Follower.onTimeout() print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): State Switch to Candidate') self.reset() elif(StateController.eql(State.state,'candidate')): Candidate.onTimeout() print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Increment Term') self.reset() else: pass
def stepDown(self, message): if (message.term > State.currentTerm and (not StateController.eql(State.state, 'follower'))): StateController.setState('follower') #print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Resetting Follower') Follower.reset(message.term) StateController.setTimer() print("(" + str(State.dc_ID) + "," + State.state + "," + str(State.currentTerm) + '): Step down...State Switch to Follower') return True else: return False
def onTimeout(self): #print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Time out!') if (StateController.eql(State.state, 'follower')): Follower.onTimeout() print("(" + str(State.dc_ID) + "," + State.state + "," + str(State.currentTerm) + '): State Switch to Candidate') self.reset() elif (StateController.eql(State.state, 'candidate')): Candidate.onTimeout() print("(" + str(State.dc_ID) + "," + State.state + "," + str(State.currentTerm) + '): Increment Term') self.reset() else: pass
def become_candidate(self): logging.warning( f'heartbeat is timeout: {int(self.election_timeout)} s') logging.info(f'{self} become candidate and start to request vote ... ') send_state_update(self.node_state, self.election_timeout) self.node_state = Candidate(self.node_state) self.node_state.elect() if self.node_state.win(): self.become_leader() else: self.become_follower()
def onRecAppendEntriesRPC(self,message): #print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Receive AppendEntriesRPC from: '+\ #str(message.leaderId)+" term"+str(message.term)) if(StateController.eql(State.state,'follower')): reply=Follower.onRecAppendEntriesRPC(message) else: reply=Receiver.onRecAppendEntriesRPC(message) sender=Sender('AppendEntriesRPCReply',reply) sender.send(self.dc_list[message.leaderId])
def onRecAppendEntriesRPC(self, message): #print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Receive AppendEntriesRPC from: '+\ #str(message.leaderId)+" term"+str(message.term)) if (StateController.eql(State.state, 'follower')): reply = Follower.onRecAppendEntriesRPC(message) else: reply = Receiver.onRecAppendEntriesRPC(message) sender = Sender('AppendEntriesRPCReply', reply) sender.send(self.dc_list[message.leaderId])
def onRecReqVoteRPC(self,message): #print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Receive ReqVoteRPC from: '+\ #str(message.candidateId)+" term"+str(message.term)) if(StateController.eql(State.state,'follower')): reply=Follower.onRecReqVoteRPC(message) else: reply=Receiver.onRecReqVoteRPC(message) #print(reply.voteGranted) sender=Sender('RequestVoteRPCReply',reply) sender.send(self.dc_list[message.candidateId])
def onRecReqVoteRPC(self, message): #print("("+str(State.dc_ID)+","+State.state+","+str(State.currentTerm)+'): Receive ReqVoteRPC from: '+\ #str(message.candidateId)+" term"+str(message.term)) if (StateController.eql(State.state, 'follower')): reply = Follower.onRecReqVoteRPC(message) else: reply = Receiver.onRecReqVoteRPC(message) #print(reply.voteGranted) sender = Sender('RequestVoteRPCReply', reply) sender.send(self.dc_list[message.candidateId])
class TimerThread(threading.Thread): def __init__(self, node_id): threading.Thread.__init__(self) self.node = cluster[node_id] self.node_state = Follower(self.node) self.election_timeout = float( randrange(ELECTION_TIMEOUT_MAX / 2, ELECTION_TIMEOUT_MAX)) self.election_timer = threading.Timer(self.election_timeout, self.become_candidate) def become_leader(self): logging.info(f'{self} become leader and start to send heartbeat ... ') send_state_update(self.node_state, self.election_timeout) self.node_state = Leader(self.node_state) self.node_state.heartbeat() def become_candidate(self): logging.warning( f'heartbeat is timeout: {int(self.election_timeout)} s') logging.info(f'{self} become candidate and start to request vote ... ') send_state_update(self.node_state, self.election_timeout) self.node_state = Candidate(self.node_state) self.node_state.elect() if self.node_state.win(): self.become_leader() else: self.become_follower() # input: candidate (id, term, lastLogIndex, lastLogTerm) # output: term, vote_granted # rule: # 1. return false if candidate.term < current_term # 2. return true if (voteFor is None or voteFor==candidate.id) and candidate's log is newer than receiver's def vote(self, vote_request: VoteRequest): logging.info(f'{self} got vote request: {vote_request} ') vote_result = self.node_state.vote(vote_request) if vote_result[0]: self.become_follower() logging.info(f'{self} return vote result: {vote_result} ') return vote_result def become_follower(self): timeout = float( randrange(ELECTION_TIMEOUT_MAX / 2, ELECTION_TIMEOUT_MAX)) if type(self.node_state) != Follower: logging.info(f'{self} become follower ... ') self.node_state = Follower(self.node) logging.info(f'{self} reset election timer {timeout} s ... ') send_state_update(self.node_state, timeout) self.election_timer.cancel() self.election_timer = threading.Timer(timeout, self.become_candidate) self.election_timer.start() def run(self): self.become_follower() def __repr__(self): return f'{type(self).__name__, self.node_state}'
def become_leader(self): logging.info(f'{self} become leader and start to send heartbeat ... ') send_state_update(self.node_state, self.election_timeout) self.node_state = Leader(self.node_state) self.node_state.heartbeat()
def create_main_window(self, api): apiManager = APIManager(api) follower = Follower(apiManager) self.ui = UI(follower)
import sys from motorControl import motorControl from leader import leader from Follower import Follower from captorDistance import captorDistance from RobotState import RobotState from pybricks.tools import DataLog, StopWatch, wait # This program requires LEGO EV3 MicroPython v2.0 or higher. # Click "Open user guide" on the EV3 extension tab for more information. #for record in records: #data.log(record['id'],record['firstname']) # Create your objects here. ev3 = EV3Brick() #state = RobotState("all_or_nothing_follow") #state = RobotState("up_to_point_follow") state = RobotState("two_points_follow") follower = Follower(state) #l = leader(1000) # Write your program here. print(sys.version) #ev3.speaker.beep(5)