예제 #1
0
 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)
예제 #2
0
 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
예제 #3
0
 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()
예제 #4
0
 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
예제 #5
0
 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
예제 #6
0
 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
예제 #7
0
 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()
예제 #8
0
 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])  
예제 #9
0
    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])
예제 #10
0
 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])
예제 #11
0
    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])
예제 #12
0
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}'
예제 #13
0
 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()
예제 #14
0
 def create_main_window(self, api):
     apiManager = APIManager(api)
     follower = Follower(apiManager)
     self.ui = UI(follower)
예제 #15
0
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)