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_
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
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, ))
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_
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
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
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_