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.")
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)