def find_predecessor(self, id):
     n_ = self.node
     # Check range wrap around # while not (n_ < id <= n_.successor):
     while not utils.check_in_node_interval(
             id, n_, n_.successor, beg_incl=False, end_incl=True):
         n_ = n_.q_closest_preceding_finger(id)
     return n_
예제 #2
0
 def update_finger_table(self, s, i):
     if utils.check_in_node_interval(s,
                                     self.node.id,
                                     self.finger_table[i].node.id,
                                     beg_incl=True,
                                     end_incl=False):
         self.finger_table[i].node = s
         p = self.predecessor  # get first node preceeding n
         p.query(Qtype.UPDATE_FINGER_TABLE, self, args=(s, i))
 def closest_preceding_finger(self, id):
     for i in range(globals.m)[::-1]:
         # Check range wrap around # if self.id < self.finger_table[i].node < id:
         if utils.check_in_node_interval(self.finger_table[i],
                                         self.node.id,
                                         id,
                                         beg_incl=False,
                                         end_incl=False):
             return self.finger_table[i].node
예제 #4
0
 def stabilize(self):
     n = self.node
     x = self.successor.query(Qtype.LOOKUP_PREDECESSOR, self)
     if utils.check_in_node_interval(x,
                                     n,
                                     self.successor,
                                     beg_incl=False,
                                     end_incl=False):
         self.successor = x
     self.successor.query(Qtype.NOTIFY, self, args=(n, ))
예제 #5
0
 def find_predecessor(self, id):
     n_ = self.node
     # Check range wrap around # while not (n_ < id <= n_.successor):
     while not utils.check_in_node_interval(
             id,
             n_,
             n_.query(Qtype.LOOKUP_SUCCESSOR, self),
             beg_incl=False,
             end_incl=True):
         n_ = n_.query(Qtype.CLOSEST_PRECEDING_FINGER, self, args=(id, ))
     return n_
예제 #6
0
 def transfer_files(self, new_id):
     # Transfer everything from (self.node.id, new_id]
     files = [
         f for f in os.listdir(self.files_dir)
         if utils.check_in_node_interval(utils.get_hash(f),
                                         self.node.id,
                                         new_id,
                                         beg_incl=False,
                                         end_incl=True)
     ]
     for f in files:
         os.remove(os.path.join(self.files_dir, f))
     return files
예제 #7
0
 def init_finger_table(self, n_):
     n = self.node
     self.finger_table[0].node = n_.query(
         Qtype.FIND_SUCCESSOR,
         chord=self,
         args=(self.finger_table[0].start, ))
     self.successor = self.finger_table[0].node
     self.predecessor = self.successor.query(Qtype.LOOKUP_PREDECESSOR, self)
     for i in range(m - 1):
         if utils.check_in_node_interval(self.finger_table[i + 1].start,
                                         n,
                                         self.finger_table[i].node,
                                         beg_incl=True,
                                         end_incl=False):
             self.finger_table[i + 1].node = self.finger_table[i].node
         else:
             self.finger_table[i + 1].node = n_.query(
                 Qtype.FIND_SUCCESSOR,
                 self,
                 args=(self.finger_table[i + 1].start, ))
     return
예제 #8
0
 def notify(self, n_):
     n = self.node
     if self.predecessor == None or utils.check_in_node_interval(
             n_, self.predecessor, n, beg_incl=False, end_incl=False):
         self.predecessor = n_