From 5afd9906b32901ee02b6316d09c8dfefb6e43fd2 Mon Sep 17 00:00:00 2001 From: Revertron Date: Mon, 26 Apr 2021 23:18:00 +0200 Subject: [PATCH] Added a failsafe mechanism, that will restart all swarm connections if network is stale. --- src/commons/constants.rs | 1 + src/p2p/network.rs | 8 ++++++-- src/p2p/peers.rs | 8 ++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/commons/constants.rs b/src/commons/constants.rs index d8a6a87..02234bc 100644 --- a/src/commons/constants.rs +++ b/src/commons/constants.rs @@ -45,4 +45,5 @@ pub const LOG_REFRESH_DELAY_SEC: u64 = 60; pub const POLL_TIMEOUT: Option = Some(Duration::from_millis(250)); pub const MAX_PACKET_SIZE: usize = 1 * 1024 * 1024; // 1 Mb pub const MAX_READ_BLOCK_TIME: u128 = 500; +pub const MAX_IDLE_SECONDS: u64 = 180; pub const MAX_NODES: usize = 15; diff --git a/src/p2p/network.rs b/src/p2p/network.rs index ae2634c..b2d4d61 100644 --- a/src/p2p/network.rs +++ b/src/p2p/network.rs @@ -67,6 +67,7 @@ impl Network { let mut last_events_time = Instant::now(); loop { if peers.get_peers_count() == 0 && bootstrap_timer.elapsed().as_secs() > 60 { + warn!("Restarting swarm connections..."); // Starting peer connections to bootstrap nodes peers.connect_peers(&peers_addrs, &poll.registry(), &mut unique_token, yggdrasil_only); bootstrap_timer = Instant::now(); @@ -135,6 +136,9 @@ impl Network { } if !events.is_empty() { last_events_time = Instant::now(); + } else if last_events_time.elapsed().as_secs() > MAX_IDLE_SECONDS { + warn!("Something is wrong with swarm connections, closing all."); + peers.close_all_peers(poll.registry()); } if ui_timer.elapsed().as_millis() > UI_REFRESH_DELAY_MS { @@ -400,7 +404,7 @@ fn handle_message(context: Arc>, message: Message, peers: &mut Pe let peer = peers.get_mut_peer(token).unwrap(); peer.set_public(public); peer.set_active(true); - debug!(">> v{} on {}", &app_version, peer.get_addr().ip()); + debug!("Incoming v{} on {}", &app_version, peer.get_addr().ip()); let app_version = context.lock().unwrap().app_version.clone(); State::message(Message::shake(&app_version, &origin, version, true, my_height)) } else { @@ -416,7 +420,7 @@ fn handle_message(context: Arc>, message: Message, peers: &mut Pe if ok { let nodes = peers.get_peers_active_count(); let peer = peers.get_mut_peer(token).unwrap(); - debug!("<< v{} on {}", &app_version, peer.get_addr().ip()); + debug!("Outgoing v{} on {}", &app_version, peer.get_addr().ip()); peer.set_height(height); peer.set_active(true); peer.reset_reconnects(); diff --git a/src/p2p/peers.rs b/src/p2p/peers.rs index 7e82bd7..917a158 100644 --- a/src/p2p/peers.rs +++ b/src/p2p/peers.rs @@ -92,6 +92,14 @@ impl Peers { } } + pub fn close_all_peers(&mut self, registry: &Registry) { + let tokens: Vec = self.peers.keys().into_iter().cloned().collect(); + for token in tokens.iter() { + self.close_peer(registry, token); + } + self.peers.clear(); + } + pub fn add_peers_from_exchange(&mut self, peers: Vec) { let peers: HashSet = peers .iter()