示例#1
0
    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)
示例#2
0
 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()
示例#3
0
 def revnotify(self, addr):
     self.successor = addr
     self.toString()
     pred = Proxy(self.predecessor.ip_addr, self.predecessor.port)
     pred.revnotify2(addr)