Beispiel #1
0
    def candidate_receive_message(self, msg):
        """
        All Candidate Message Receiving
        @:param msg - the JSON message received
        @:return: Void
        """
        if msg['type'] == 'vote':
            #print str(self.id) + ": Got Vote Message----------"
            message = Message.create_message_from_json(msg)
            self.receive_vote(message)

        if msg['type'] == 'heartbeat':
            #print str(self.id) + "got ~~~HEARTBEAT~~~"
            heart_beat = Message.create_message_from_json(msg)

            if heart_beat.term >= self.current_term:
                self.current_term = heart_beat.term
                self.become_follower(heart_beat.leader)

        if msg['type'] == 'voteRequest':
            message = Message.create_message_from_json(msg)
            if message.term > self.current_term:
                self.become_follower(msg['leader'])

        if msg['type'] in ['get', 'put']:
            message = Message.create_message_from_json(msg)
            redirect_message = message.create_redirect_message("FFFF")

            self.send(redirect_message)
Beispiel #2
0
    def leader_receive_message(self, msg):
        """
        All Leader Message Receiving
        @:param msg - the JSON message received
        @:return: Void
        """
        if msg['type'] in ['get', 'put']:
            # print ":" + str(self.id) + " :LEADER: RECV: " + msg['type'] + " : mid= " + msg['MID']
            self.add_to_client_queue(msg)


        # elif msg['type'] == 'heartbeatACK':
        #     print ":" + self.id + " :LEADER: RECV: " + msg['type'] + " : mid= " + str(msg['MID'])
        #     self.get_new_election_timeout()
        #     # TODO: commit log entry yet?????

        if msg['type'] == 'heartbeat':
            # print ":" + str(self.id) + " :LEADER: RECV: " + msg['type'] + " : mid= " + str(msg['MID'])
            message = Message.create_message_from_json(msg)

            if message.term > self.current_term:
                # print ":" + str(self.id) + " :LEADER: RECV: BECOMING FOLLOWER 0"
                self.become_follower(message.leader)

        if msg['type'] == 'voteRequest':
            # print ":" + str(self.id) + " :LEADER: RECV: " + msg['type'] + " : mid= " + str(msg['MID'])
            message = Message.create_message_from_json(msg)
            if message.term > self.current_term:
                if len(self.log):
                    if msg['last_entry_term'] >= self.log[-1][1] and msg['log_size'] >= len(self.log):
                        # print ":" + str(self.id) + " :LEADER: RECV: BECOMING FOLLOWER 1"
                        self.become_follower(msg['leader'])
                        #self.voted_for = msg['src']
                else:
                    # print ":" + str(self.id) + " :LEADER: RECV: BECOMING FOLLOWER 2"
                    self.become_follower(msg['leader'])
                    #self.voted_for = msg['src']

        if msg['type'] == 'appendACK':
            # print ":" + str(self.id) + " :LEADER: RECV: " + msg['type'] + " : src= " + str(msg['src'])
            self.receive_append_ack(msg)
Beispiel #3
0
 def receive_heartbeat(self, msg):
     """
     Run the functions necessary when receiving a heartbeat, only if the heartbeat is 'valid'
     @:param msg - the message (json) from the leader
     @:return: Void
     """
     if msg['term'] >= self.current_term:
         heart_beat = Message.create_message_from_json(msg)
         self.current_term = heart_beat.term
         self.leader_id = heart_beat.leader
         self.get_new_election_timeout()
         self.run_command_follower(msg['leader_last_applied'])
Beispiel #4
0
    def receive_vote_request_as_follower(self, msg):
        """
        Run the desired functions when receiving a vote request from a Candidate
        @:param msg - the json message received from the candidate
        @:return: Void
        """
        #print str(self.id) + ": RECEIVED VOTE REQUEST from: " + str(msg['src']) + " time=" + str(datetime.datetime.now())

        vote_req_message = Message.create_message_from_json(msg)

        if vote_req_message.term >= self.current_term:
            if self.voted_for is None or self.voted_for == vote_req_message.src:
                if len(self.log):
                    if msg['last_entry_term'] >= self.log[-1][1] and msg['log_size'] >= len(self.log):
                        self.send_vote(vote_req_message)
                        self.get_new_election_timeout()
                else:
                    self.send_vote(vote_req_message)
                    self.get_new_election_timeout()
Beispiel #5
0
    def follower_receive_message(self, msg):
        """
        All Follower Message Receiving
        @:param msg - the JSON message received
        @:return: Void
        """
        if msg['type'] == 'heartbeat':
            self.receive_heartbeat(msg)

        if msg['type'] == 'voteRequest':
            self.receive_vote_request_as_follower(msg)

        if msg['type'] in ['get', 'put']:
            message = Message.create_message_from_json(msg)
            redirect_message = message.create_redirect_message(self.leader_id)

            self.send(redirect_message)

        if msg['type'] == 'appendEntry':
            self.receive_append_entry(msg)