fix hang
This commit is contained in:
		| @@ -500,7 +500,42 @@ impl RoutingTable { | ||||
|     } | ||||
|  | ||||
|     pub fn get_recent_peers(&self) -> Vec<(DHTKey, RecentPeersEntry)> { | ||||
|         self.inner.write().get_recent_peers(self.clone()) | ||||
|         let mut recent_peers = Vec::new(); | ||||
|         let mut dead_peers = Vec::new(); | ||||
|         let mut out = Vec::new(); | ||||
|  | ||||
|         // collect all recent peers | ||||
|         { | ||||
|             let inner = self.inner.read(); | ||||
|             for (k, _v) in &inner.recent_peers { | ||||
|                 recent_peers.push(*k); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // look up each node and make sure the connection is still live | ||||
|         // (uses same logic as send_data, ensuring last_connection works for UDP) | ||||
|         for e in &recent_peers { | ||||
|             let mut dead = true; | ||||
|             if let Some(nr) = self.lookup_node_ref(*e) { | ||||
|                 if let Some(last_connection) = nr.last_connection() { | ||||
|                     out.push((*e, RecentPeersEntry { last_connection })); | ||||
|                     dead = false; | ||||
|                 } | ||||
|             } | ||||
|             if dead { | ||||
|                 dead_peers.push(e); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // purge dead recent peers | ||||
|         { | ||||
|             let mut inner = self.inner.write(); | ||||
|             for d in dead_peers { | ||||
|                 inner.recent_peers.remove(d); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         out | ||||
|     } | ||||
|  | ||||
|     pub fn touch_recent_peer(&self, node_id: DHTKey, last_connection: ConnectionDescriptor) { | ||||
|   | ||||
| @@ -749,42 +749,6 @@ impl RoutingTableInner { | ||||
|         health | ||||
|     } | ||||
|  | ||||
|     pub fn get_recent_peers( | ||||
|         &mut self, | ||||
|         outer_self: RoutingTable, | ||||
|     ) -> Vec<(DHTKey, RecentPeersEntry)> { | ||||
|         let mut recent_peers = Vec::new(); | ||||
|         let mut dead_peers = Vec::new(); | ||||
|         let mut out = Vec::new(); | ||||
|  | ||||
|         // collect all recent peers | ||||
|         for (k, _v) in &self.recent_peers { | ||||
|             recent_peers.push(*k); | ||||
|         } | ||||
|  | ||||
|         // look up each node and make sure the connection is still live | ||||
|         // (uses same logic as send_data, ensuring last_connection works for UDP) | ||||
|         for e in &recent_peers { | ||||
|             let mut dead = true; | ||||
|             if let Some(nr) = self.lookup_node_ref(outer_self.clone(), *e) { | ||||
|                 if let Some(last_connection) = nr.last_connection() { | ||||
|                     out.push((*e, RecentPeersEntry { last_connection })); | ||||
|                     dead = false; | ||||
|                 } | ||||
|             } | ||||
|             if dead { | ||||
|                 dead_peers.push(e); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // purge dead recent peers | ||||
|         for d in dead_peers { | ||||
|             self.recent_peers.remove(d); | ||||
|         } | ||||
|  | ||||
|         out | ||||
|     } | ||||
|  | ||||
|     pub fn touch_recent_peer(&mut self, node_id: DHTKey, last_connection: ConnectionDescriptor) { | ||||
|         self.recent_peers | ||||
|             .insert(node_id, RecentPeersEntry { last_connection }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user