aboutsummaryrefslogtreecommitdiff
path: root/src/peering
diff options
context:
space:
mode:
Diffstat (limited to 'src/peering')
-rw-r--r--src/peering/fullmesh.rs46
1 files changed, 24 insertions, 22 deletions
diff --git a/src/peering/fullmesh.rs b/src/peering/fullmesh.rs
index b0bbe45..8b1c802 100644
--- a/src/peering/fullmesh.rs
+++ b/src/peering/fullmesh.rs
@@ -187,32 +187,34 @@ impl FullMeshPeeringStrategy {
pub async fn run(self: Arc<Self>) {
loop {
// 1. Read current state: get list of connected peers (ping them)
- let known_hosts = self.known_hosts.read().unwrap();
- debug!("known_hosts: {} peers", known_hosts.list.len());
-
- let mut to_ping = vec![];
- let mut to_retry = vec![];
- for (id, info) in known_hosts.list.iter() {
- debug!("{}, {:?}", hex::encode(id), info);
- match info.state {
- PeerConnState::Connected => {
- let must_ping = match info.last_seen {
- None => true,
- Some(t) => Instant::now() - t > PING_INTERVAL,
- };
- if must_ping {
- to_ping.push(*id);
+ let (to_ping, to_retry) = {
+ let known_hosts = self.known_hosts.read().unwrap();
+ debug!("known_hosts: {} peers", known_hosts.list.len());
+
+ let mut to_ping = vec![];
+ let mut to_retry = vec![];
+ for (id, info) in known_hosts.list.iter() {
+ debug!("{}, {:?}", hex::encode(id), info);
+ match info.state {
+ PeerConnState::Connected => {
+ let must_ping = match info.last_seen {
+ None => true,
+ Some(t) => Instant::now() - t > PING_INTERVAL,
+ };
+ if must_ping {
+ to_ping.push(*id);
+ }
}
- }
- PeerConnState::Waiting(_, t) => {
- if Instant::now() >= t {
- to_retry.push(*id);
+ PeerConnState::Waiting(_, t) => {
+ if Instant::now() >= t {
+ to_retry.push(*id);
+ }
}
+ _ => (),
}
- _ => (),
}
- }
- drop(known_hosts);
+ (to_ping, to_retry)
+ };
// 2. Dispatch ping to hosts
trace!("to_ping: {} peers", to_retry.len());