|
@@ -30,8 +30,7 @@ class GRPCDiscovery(Discovery):
|
|
self.listen_port = listen_port
|
|
self.listen_port = listen_port
|
|
self.broadcast_port = broadcast_port if broadcast_port is not None else listen_port
|
|
self.broadcast_port = broadcast_port if broadcast_port is not None else listen_port
|
|
self.broadcast_interval = broadcast_interval
|
|
self.broadcast_interval = broadcast_interval
|
|
- self.known_peers: Dict[str, GRPCPeerHandle] = {}
|
|
|
|
- self.peer_last_seen: Dict[str, float] = {}
|
|
|
|
|
|
+ self.known_peers: Dict[str, Tuple[GRPCPeerHandle, float]] = {}
|
|
self.broadcast_task = None
|
|
self.broadcast_task = None
|
|
self.listen_task = None
|
|
self.listen_task = None
|
|
self.cleanup_task = None
|
|
self.cleanup_task = None
|
|
@@ -74,7 +73,7 @@ class GRPCDiscovery(Discovery):
|
|
if DEBUG_DISCOVERY >= 2: print("No new peers discovered in the last grace period. Ending discovery process.")
|
|
if DEBUG_DISCOVERY >= 2: print("No new peers discovered in the last grace period. Ending discovery process.")
|
|
break # No new peers found in the grace period, we are done
|
|
break # No new peers found in the grace period, we are done
|
|
|
|
|
|
- return list(self.known_peers.values())
|
|
|
|
|
|
+ return [peer_handle for peer_handle, _ in self.known_peers.values()]
|
|
|
|
|
|
async def task_broadcast_presence(self):
|
|
async def task_broadcast_presence(self):
|
|
transport, _ = await asyncio.get_event_loop().create_datagram_endpoint(
|
|
transport, _ = await asyncio.get_event_loop().create_datagram_endpoint(
|
|
@@ -110,9 +109,9 @@ class GRPCDiscovery(Discovery):
|
|
peer_port = message['grpc_port']
|
|
peer_port = message['grpc_port']
|
|
device_capabilities = DeviceCapabilities(**message['device_capabilities'])
|
|
device_capabilities = DeviceCapabilities(**message['device_capabilities'])
|
|
if peer_id not in self.known_peers:
|
|
if peer_id not in self.known_peers:
|
|
- self.known_peers[peer_id] = GRPCPeerHandle(peer_id, f"{peer_host}:{peer_port}", device_capabilities)
|
|
|
|
|
|
+ self.known_peers[peer_id] = (GRPCPeerHandle(peer_id, f"{peer_host}:{peer_port}", device_capabilities), time.time())
|
|
if DEBUG_DISCOVERY >= 2: print(f"Discovered new peer {peer_id} at {peer_host}:{peer_port}")
|
|
if DEBUG_DISCOVERY >= 2: print(f"Discovered new peer {peer_id} at {peer_host}:{peer_port}")
|
|
- self.peer_last_seen[peer_id] = time.time()
|
|
|
|
|
|
+ self.known_peers[peer_id] = (self.known_peers[peer_id][0], time.time())
|
|
|
|
|
|
async def task_listen_for_peers(self):
|
|
async def task_listen_for_peers(self):
|
|
await asyncio.get_event_loop().create_datagram_endpoint(lambda: ListenProtocol(self.on_listen_message), local_addr=('0.0.0.0', self.listen_port))
|
|
await asyncio.get_event_loop().create_datagram_endpoint(lambda: ListenProtocol(self.on_listen_message), local_addr=('0.0.0.0', self.listen_port))
|
|
@@ -120,11 +119,17 @@ class GRPCDiscovery(Discovery):
|
|
|
|
|
|
async def task_cleanup_peers(self):
|
|
async def task_cleanup_peers(self):
|
|
while True:
|
|
while True:
|
|
- current_time = time.time()
|
|
|
|
- timeout = 15 * self.broadcast_interval
|
|
|
|
- peers_to_remove = [peer_id for peer_id, last_seen in self.peer_last_seen.items() if current_time - last_seen > timeout]
|
|
|
|
- for peer_id in peers_to_remove:
|
|
|
|
- del self.known_peers[peer_id]
|
|
|
|
- del self.peer_last_seen[peer_id]
|
|
|
|
- if DEBUG_DISCOVERY >= 2: print(f"Removed peer {peer_id} due to inactivity.")
|
|
|
|
- await asyncio.sleep(self.broadcast_interval)
|
|
|
|
|
|
+ try:
|
|
|
|
+ current_time = time.time()
|
|
|
|
+ timeout = 15 * self.broadcast_interval
|
|
|
|
+ peers_to_remove = [peer_handle.id() for peer_handle, last_seen in self.known_peers.values() if not await peer_handle.is_connected() or current_time - last_seen > timeout]
|
|
|
|
+ if DEBUG_DISCOVERY >= 2: print("Peer statuses:", {peer_handle.id(): f"is_connected={await peer_handle.is_connected()}, last_seen={last_seen}" for peer_handle, last_seen in self.known_peers.values()})
|
|
|
|
+ if DEBUG_DISCOVERY >= 2 and len(peers_to_remove) > 0: print(f"Cleaning up peers: {peers_to_remove}")
|
|
|
|
+ for peer_id in peers_to_remove:
|
|
|
|
+ if peer_id in self.known_peers: del self.known_peers[peer_id]
|
|
|
|
+ if DEBUG_DISCOVERY >= 2: print(f"Removed peer {peer_id} due to inactivity.")
|
|
|
|
+ await asyncio.sleep(self.broadcast_interval)
|
|
|
|
+ except Exception as e:
|
|
|
|
+ print(f"Error in cleanup peers: {e}")
|
|
|
|
+ import traceback
|
|
|
|
+ print(traceback.format_exc())
|