Sped up P2P reconnections after sleep. Ensured successfull peer resolution. Updated dependencies.
This commit is contained in:
Generated
+8
-8
@@ -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",
|
||||
|
||||
+4
-4
@@ -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;
|
||||
|
||||
+27
-4
@@ -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
|
||||
}
|
||||
|
||||
+27
-10
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user