Example #1
0
    def youAreLeader_handler(self, addr, args, recievedMsg):
        print("\n" + addr)
        if self.electionStatus is not None and self.electionStatus.decided == False:
            response = Election.fromString(recievedMsg)
            if response.view > self.electionStatus.view and (
                    response.view % self.totalNumber) != self.pid:  # not me
                self.electionStatus.latestValue = Message.fromString(
                    response.latestValue)

            if self.electionStatus.majorityCheck.addVoteAndCheck():
                self.electionStatus.decided = True
                print("Yeah, I become a leader, pid: ", self.pid)
                #self.leaderAlive = True

                hole = self.detectHole()
                if hole != -1:
                    filling = Record(self.view, hole, self.buffer[0])
                    self.propose(filling)

                if self.electionStatus.latestValue is not None:  #doubt, why is this here?
                    latestMsg = Message(self.electionStatus.latestValue)
                    fromPrevious = Record(self.view, response.roundNumber,
                                          latestMsg)
                    self.propose(fromPrevious)

                print("Ready to process client requests.")
Example #2
0
    def iAmLeader_handler(self, addr, args, recievedMsg):
        print("\n" + addr)
        self.leaderAlive = True
        election = Election.fromString(recievedMsg)
        newView = election.view
        newLeader = newView % self.totalNumber
        newRound = election.roundNumber
        print("Process {} sent iAmLeader.".format(newLeader))

        if newView >= self.view:
            previousView = self.view
            self.view = newView

            # send back my previous state
            if self.lastRound == newRound - 1:  # normal case
                previousValue = None
            elif self.lastRound == newRound:
                record = self.records[newRound]
                #if record.learned == Falise: # only when it is not learned yet
                previousValue = record.message
                #else:
                #    previousValue = None
            elif self.lastRound < newRound:
                print("I am missing something")
                # TODO ask other server for the missing value
                #should send previous value as None and learn it only if it has already been learned or learn it anyways?
                #update learning based on view number and if it learned, mark it (things to learn from others)
                #use for loop to send one by one with round number
                previousValue = None
                #count = (newRound-1) - self.lastRound
                roundNumberTemp = self.lastRound + 1
                while roundNumberTemp < newRound:
                    sendingMsg = "server\t{}\t{}".format(
                        str(self.pid), str(roundNumberTemp))
                    self.sendMessageToServers("/requestMissingValue",
                                              sendingMsg)
                    roundNumberTemp += 1
            elif self.lastRound > newRound:
                # this guy is missing some records.
                self.sendLeaderFaulty()
                return

            print("Sending youAreLeader...")
            response = Election(previousView, self.lastRound, previousValue)
            leaderChannel = self.sendChannels[newLeader]
            # leaderChannel.send_message("/youAreLeader", response.toString())
            sendMessageWithLoss(leaderChannel, "/youAreLeader",
                                response.toString(), self.lossRate)