From b8d505da2e0ec58dc5aaad1c3da6e8c96aa79f5c Mon Sep 17 00:00:00 2001 From: Revertron Date: Wed, 12 Jan 2022 15:56:16 +0100 Subject: [PATCH] Sped up P2P reconnections after sleep. Ensured successfull peer resolution. Updated dependencies. --- Cargo.lock | 16 ++++++++-------- Cargo.toml | 8 ++++---- src/commons/constants.rs | 1 + src/p2p/network.rs | 31 +++++++++++++++++++++++++++---- src/p2p/peers.rs | 37 +++++++++++++++++++++++++++---------- 5 files changed, 67 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 703f0fd..7bae364 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -84,7 +84,7 @@ dependencies = [ [[package]] name = "alfis" -version = "0.6.10" +version = "0.6.11" dependencies = [ "base64", "bincode", @@ -112,7 +112,7 @@ dependencies = [ "serde_cbor", "serde_derive", "serde_json", - "sha2 0.10.0", + "sha2 0.10.1", "signature", "simplelog", "sqlite", @@ -1130,9 +1130,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900d964dd36bb15bcf2f2b35694c072feab74969a54f2bbeec7a2d725d2bdcb6" +checksum = "99c3bd8169c58782adad9290a9af5939994036b76187f7b4f0e6de91dbbfc0ec" dependencies = [ "cfg-if", "cpufeatures", @@ -1141,9 +1141,9 @@ dependencies = [ [[package]] name = "signature" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" +checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" [[package]] name = "simplelog" @@ -1322,9 +1322,9 @@ dependencies = [ [[package]] name = "tinyfiledialogs" -version = "3.8.3" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9545b2375cbcb7a7d70cca5e92fbaa096fd89bebd2fbc54a3da7f37d15a54e6b" +checksum = "adc577626a3c26e4e1d470dbe5fe33d6fabc14e57114cb377acdb4da1a17dde9" dependencies = [ "cc", "libc", diff --git a/Cargo.toml b/Cargo.toml index f7ab589..33bce30 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "alfis" -version = "0.6.10" +version = "0.6.11" authors = ["Revertron "] edition = "2021" build = "build.rs" @@ -16,12 +16,12 @@ log = "0.4.14" simplelog = "0.11.1" toml = "0.5.8" digest = "0.10.1" -sha2 = "0.10.0" +sha2 = "0.10.1" ed25519-dalek = "1.0" x25519-dalek = "1.2" ecies-ed25519 = "0.5" chacha20poly1305 = "0.9" -signature = "1.3.1" +signature = "1.5" blakeout = "0.3.0" num_cpus = "1.13.1" byteorder = "1.4.3" @@ -45,7 +45,7 @@ lazy_static = "1.4.0" # Optional dependencies regulated by features web-view = { version = "0.7.3", features = [], optional = true } -tinyfiledialogs = { version = "3.8.3", optional = true } +tinyfiledialogs = { version = "3.9", optional = true } open = { version = "2.0.2", optional = true } [target.'cfg(windows)'.dependencies] diff --git a/src/commons/constants.rs b/src/commons/constants.rs index 85b99c0..15d664d 100644 --- a/src/commons/constants.rs +++ b/src/commons/constants.rs @@ -40,6 +40,7 @@ pub const UI_REFRESH_DELAY_MS: u128 = 500; pub const LOG_REFRESH_DELAY_SEC: u64 = 60; pub const POLL_TIMEOUT: Option = Some(Duration::from_millis(500)); +pub const WAIT_FOR_INTERNET: Duration = Duration::from_secs(10); /// We start syncing blocks only when we got 4 and more connected nodes pub const MIN_CONNECTED_NODES_START_SYNC: usize = 4; pub const MAX_READ_BLOCK_TIME: u128 = 100; diff --git a/src/p2p/network.rs b/src/p2p/network.rs index 365e6a5..6c4cf52 100644 --- a/src/p2p/network.rs +++ b/src/p2p/network.rs @@ -4,7 +4,7 @@ extern crate serde_json; use std::cmp::max; use std::collections::{HashMap, HashSet}; use std::io::{Error, ErrorKind, Read, Write}; -use std::net::{IpAddr, Shutdown, SocketAddr, SocketAddrV4}; +use std::net::{IpAddr, Shutdown, SocketAddr, SocketAddrV4, ToSocketAddrs}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; use std::time::{Duration, Instant}; @@ -69,6 +69,7 @@ impl Network { poll.registry().register(&mut server, SERVER, Interest::READABLE).expect("Error registering poll"); // Starting peer connections to bootstrap nodes + wait_for_internet(WAIT_FOR_INTERNET); self.peers.connect_peers(&peers_addrs, poll.registry(), &mut self.token, yggdrasil_only); let mut ui_timer = Instant::now(); @@ -82,6 +83,7 @@ impl Network { loop { if self.peers.get_peers_count() == 0 && bootstrap_timer.elapsed().as_secs() > 60 { warn!("Restarting swarm connections..."); + wait_for_internet(WAIT_FOR_INTERNET); // Starting peer connections to bootstrap nodes self.peers.connect_peers(&peers_addrs, poll.registry(), &mut self.token, yggdrasil_only); bootstrap_timer = Instant::now(); @@ -146,9 +148,7 @@ impl Network { } } } - if !events.is_empty() { - last_events_time = Instant::now(); - } else if last_events_time.elapsed().as_secs() > MAX_IDLE_SECONDS { + if last_events_time.elapsed().as_secs() > MAX_IDLE_SECONDS { if self.peers.get_peers_count() > 0 { warn!("Something is wrong with swarm connections, closing all."); self.peers.close_all_peers(poll.registry()); @@ -156,6 +156,8 @@ impl Network { } else { thread::sleep(POLL_TIMEOUT.unwrap()); } + } else if !events.is_empty() { + last_events_time = Instant::now(); } if ui_timer.elapsed().as_millis() > UI_REFRESH_DELAY_MS { @@ -843,6 +845,27 @@ fn send_message(connection: &mut TcpStream, data: &[u8]) -> io::Result<()> { connection.flush() } +fn wait_for_internet(timeout: Duration) { + let addr = "alfis.name:443"; + let start = Instant::now(); + let delay = Duration::from_millis(200); + + trace!("Waiting for internet connection..."); + while start.elapsed() < timeout { + match addr.to_socket_addrs() { + Ok(_) => { + trace!("We got internet connection!"); + return; + }, + Err(_) => { + thread::sleep(delay); + continue; + } + }; + } + trace!("Waiting for internet connection has timed out.") +} + fn would_block(err: &io::Error) -> bool { err.kind() == io::ErrorKind::WouldBlock } diff --git a/src/p2p/peers.rs b/src/p2p/peers.rs index 39dbb6f..cd06665 100644 --- a/src/p2p/peers.rs +++ b/src/p2p/peers.rs @@ -1,8 +1,8 @@ use std::cmp::min; use std::collections::{HashMap, HashSet}; -use std::io; +use std::{io, thread}; use std::net::{IpAddr, Shutdown, SocketAddr, ToSocketAddrs}; -use std::time::Instant; +use std::time::{Duration, Instant}; use chrono::Utc; #[allow(unused_imports)] @@ -382,18 +382,12 @@ impl Peers { pub fn connect_peers(&mut self, peers_addrs: &[String], registry: &Registry, unique_token: &mut Token, yggdrasil_only: bool) { let mut set = HashSet::new(); for peer in peers_addrs.iter() { - info!("Resolving address {}", peer); - let mut addresses: Vec = match peer.to_socket_addrs() { - Ok(peers) => peers.collect(), - Err(_) => { error!("Can't resolve address {}", &peer); continue; } - }; - info!("Got addresses: {:?}", &addresses); - - // At first we connect to 5 peer addresses + // At first we connect to 10 peer addresses if set.len() >= 10 { break; } + let mut addresses = Self::resolve(peer); while !addresses.is_empty() { let addr = addresses.remove(0); if !set.contains(&addr) { @@ -415,6 +409,29 @@ impl Peers { } } + /// Tries to resolve some address several times with timeout + fn resolve(peer: &str) -> Vec { + info!("Resolving address {}", peer); + let start = Instant::now(); + let delay = Duration::from_millis(20); + let timeout = Duration::from_millis(200); + while start.elapsed() < timeout { + let addresses: Vec = match peer.to_socket_addrs() { + Ok(peers) => peers.collect(), + Err(e) => { + trace!("Can't resolve address {}: {}", &peer, e); + thread::sleep(delay); + continue; + } + }; + if !addresses.is_empty() { + info!("Got addresses: {:?}", &addresses); + return addresses; + } + } + vec![] + } + fn connect_peer(&mut self, addr: &SocketAddr, registry: &Registry, unique_token: &mut Token, yggdrasil_only: bool) -> io::Result<()> { if self.ignored.contains(&addr.ip()) { return Err(io::Error::from(io::ErrorKind::ConnectionAborted));