def _collect_nodes(self): addrs = self.get_remote_endpoints() print "_collect_nodes: addrs=", addrs local_ips = get_host_ips() ips = set() for (ip, port) in addrs: if ip is not None and ip != "0.0.0.0" and ip not in local_ips: ips.add(ip) self.rttmonitor.set_nodes_restart(ips) delay = 5 if len(ips) > 0: delay = 300 self.add_task(delay, self._collect_nodes)
def _collect_nodes(self): addrs = self.get_remote_endpoints() print "_collect_nodes: addrs=",addrs local_ips = get_host_ips() ips = set() for (ip, port) in addrs: if ip is not None and ip != "0.0.0.0" and ip not in local_ips: ips.add(ip) self.rttmonitor.set_nodes_restart(ips) delay = 5 if len(ips) > 0: delay = 300 self.add_task(delay, self._collect_nodes)
def run(self, nodes): q = Queue.Queue() dst = None # handy for hard-coding common node #dst = '68.87.195.50'; nodes = [dst,]; common = nodes if not dst: threads = [] for i in nodes: t = daemon_thread(target=self.get_route, args=(q, i, )) threads.append(t) t.start() waiter_done_event = threading.Event() def waiter(threads, waiter_done_event): try: for thread in threads: thread.join() except Exception, e: print "waiter hiccupped", e waiter_done_event.set() waiting_thread = daemon_thread(target=waiter, args=(threads, waiter_done_event, )) waiting_thread.start() common = [] routes = {} while not waiter_done_event.isSet(): try: msg = q.get(True, 1.0) except Queue.Empty: pass else: dst = msg[0] # nodes appear in the queue in # increasing order of TTL. new_node = msg[1] if dst not in routes: l = [] routes[dst] = l else: l = routes[dst] l.append(new_node) branch, common = in_common(routes.values()) if branch: break self.abort_traceroute.set() waiter_done_event.wait() self.abort_traceroute.clear() local_ips = get_host_ips() new_common = [] for c in common: if c not in local_ips: new_common.append(c) common = new_common if debug: pprint(common) if len(common) == 0: # this should be inspected, it's not a simple debug message if debug: print "No common node", routes return del routes dst = common[-1]