def join_network(self): # start event listener thread t = threading.Thread(target=self.start) t.daemon = True t.start() # if we are root if self.is_root == 1: self.root = None self.successor = None self.sucsuccessor = None self.predecessor = None self.sec_successor = None self.toString() # if we are peer else: self.predecessor = None self.sucsuccessor = None # contact the root to find our successor self.root = Proxy(self.root_addr.ip_addr, self.root_addr.port) self.successor = self.root.find_successor(self.address.NODEID) # set our predecessor succ = Proxy(self.successor.ip_addr, self.successor.port) tmp = succ.getpredec() if not tmp: succ.notify(self.address) else: pred = Proxy(tmp.ip_addr, tmp.port) pred.revnotify(self.address) pred.revnotify2(self.successor) self.predecessor = tmp succ.notify(self.address) # get successor's successor self.sucsuccessor = succ.getsucc() # inherit necessary files from successor self.inherit() # print current state of the node self.toString() # start stabilizing thread s = threading.Thread(target=self.periodical) s.daemon = True s.start() # don't kill the main thread so that deamon threads can survive while True: time.sleep(1)
def periodical(self): while 1: # check every 3 seconds time.sleep(3) if self.successor: if not self.ping(self.successor): # fix the broken segment by reassigning pointers print("%s failed: Stabilizing...\n" % self.successor.hostname) if self.successor.NODEID == self.predecessor.NODEID: self.reset() self.toString() else: self.successor = self.sucsuccessor sucsuc = Proxy(self.sucsuccessor.ip_addr, self.sucsuccessor.port) self.sucsuccessor = sucsuc.getsucc() sucsuc.notify(self.address) pred = Proxy(self.predecessor.ip_addr, self.predecessor.port) pred.revnotify2(self.successor) self.toString()
def revnotify(self, addr): self.successor = addr self.toString() pred = Proxy(self.predecessor.ip_addr, self.predecessor.port) pred.revnotify2(addr)