Sped up P2P reconnections after sleep. Ensured successfull peer resolution. Updated dependencies.

pull/206/head
Revertron 2 years ago
parent fceaa2eaac
commit b8d505da2e

16
Cargo.lock generated

@ -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",

@ -1,6 +1,6 @@
[package]
name = "alfis"
version = "0.6.10"
version = "0.6.11"
authors = ["Revertron <alfis@revertron.com>"]
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]

@ -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<Duration> = 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;

@ -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
}

@ -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<SocketAddr> = 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<SocketAddr> {
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<SocketAddr> = 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));

Loading…
Cancel
Save