Added a failsafe mechanism, that will restart all swarm connections if network is stale.
This commit is contained in:
@@ -45,4 +45,5 @@ pub const LOG_REFRESH_DELAY_SEC: u64 = 60;
|
|||||||
pub const POLL_TIMEOUT: Option<Duration> = Some(Duration::from_millis(250));
|
pub const POLL_TIMEOUT: Option<Duration> = Some(Duration::from_millis(250));
|
||||||
pub const MAX_PACKET_SIZE: usize = 1 * 1024 * 1024; // 1 Mb
|
pub const MAX_PACKET_SIZE: usize = 1 * 1024 * 1024; // 1 Mb
|
||||||
pub const MAX_READ_BLOCK_TIME: u128 = 500;
|
pub const MAX_READ_BLOCK_TIME: u128 = 500;
|
||||||
|
pub const MAX_IDLE_SECONDS: u64 = 180;
|
||||||
pub const MAX_NODES: usize = 15;
|
pub const MAX_NODES: usize = 15;
|
||||||
|
|||||||
+6
-2
@@ -67,6 +67,7 @@ impl Network {
|
|||||||
let mut last_events_time = Instant::now();
|
let mut last_events_time = Instant::now();
|
||||||
loop {
|
loop {
|
||||||
if peers.get_peers_count() == 0 && bootstrap_timer.elapsed().as_secs() > 60 {
|
if peers.get_peers_count() == 0 && bootstrap_timer.elapsed().as_secs() > 60 {
|
||||||
|
warn!("Restarting swarm connections...");
|
||||||
// Starting peer connections to bootstrap nodes
|
// Starting peer connections to bootstrap nodes
|
||||||
peers.connect_peers(&peers_addrs, &poll.registry(), &mut unique_token, yggdrasil_only);
|
peers.connect_peers(&peers_addrs, &poll.registry(), &mut unique_token, yggdrasil_only);
|
||||||
bootstrap_timer = Instant::now();
|
bootstrap_timer = Instant::now();
|
||||||
@@ -135,6 +136,9 @@ impl Network {
|
|||||||
}
|
}
|
||||||
if !events.is_empty() {
|
if !events.is_empty() {
|
||||||
last_events_time = Instant::now();
|
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 {
|
if ui_timer.elapsed().as_millis() > UI_REFRESH_DELAY_MS {
|
||||||
@@ -400,7 +404,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
|
|||||||
let peer = peers.get_mut_peer(token).unwrap();
|
let peer = peers.get_mut_peer(token).unwrap();
|
||||||
peer.set_public(public);
|
peer.set_public(public);
|
||||||
peer.set_active(true);
|
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();
|
let app_version = context.lock().unwrap().app_version.clone();
|
||||||
State::message(Message::shake(&app_version, &origin, version, true, my_height))
|
State::message(Message::shake(&app_version, &origin, version, true, my_height))
|
||||||
} else {
|
} else {
|
||||||
@@ -416,7 +420,7 @@ fn handle_message(context: Arc<Mutex<Context>>, message: Message, peers: &mut Pe
|
|||||||
if ok {
|
if ok {
|
||||||
let nodes = peers.get_peers_active_count();
|
let nodes = peers.get_peers_active_count();
|
||||||
let peer = peers.get_mut_peer(token).unwrap();
|
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_height(height);
|
||||||
peer.set_active(true);
|
peer.set_active(true);
|
||||||
peer.reset_reconnects();
|
peer.reset_reconnects();
|
||||||
|
|||||||
@@ -92,6 +92,14 @@ impl Peers {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn close_all_peers(&mut self, registry: &Registry) {
|
||||||
|
let tokens: Vec<Token> = 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<String>) {
|
pub fn add_peers_from_exchange(&mut self, peers: Vec<String>) {
|
||||||
let peers: HashSet<String> = peers
|
let peers: HashSet<String> = peers
|
||||||
.iter()
|
.iter()
|
||||||
|
|||||||
Reference in New Issue
Block a user