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]]
|
[[package]]
|
||||||
name = "alfis"
|
name = "alfis"
|
||||||
version = "0.6.10"
|
version = "0.6.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"bincode",
|
"bincode",
|
||||||
@@ -112,7 +112,7 @@ dependencies = [
|
|||||||
"serde_cbor",
|
"serde_cbor",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2 0.10.0",
|
"sha2 0.10.1",
|
||||||
"signature",
|
"signature",
|
||||||
"simplelog",
|
"simplelog",
|
||||||
"sqlite",
|
"sqlite",
|
||||||
@@ -1130,9 +1130,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sha2"
|
name = "sha2"
|
||||||
version = "0.10.0"
|
version = "0.10.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "900d964dd36bb15bcf2f2b35694c072feab74969a54f2bbeec7a2d725d2bdcb6"
|
checksum = "99c3bd8169c58782adad9290a9af5939994036b76187f7b4f0e6de91dbbfc0ec"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"cpufeatures",
|
"cpufeatures",
|
||||||
@@ -1141,9 +1141,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signature"
|
name = "signature"
|
||||||
version = "1.4.0"
|
version = "1.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788"
|
checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "simplelog"
|
name = "simplelog"
|
||||||
@@ -1322,9 +1322,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tinyfiledialogs"
|
name = "tinyfiledialogs"
|
||||||
version = "3.8.3"
|
version = "3.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9545b2375cbcb7a7d70cca5e92fbaa096fd89bebd2fbc54a3da7f37d15a54e6b"
|
checksum = "adc577626a3c26e4e1d470dbe5fe33d6fabc14e57114cb377acdb4da1a17dde9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"libc",
|
"libc",
|
||||||
|
|||||||
+4
-4
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "alfis"
|
name = "alfis"
|
||||||
version = "0.6.10"
|
version = "0.6.11"
|
||||||
authors = ["Revertron <alfis@revertron.com>"]
|
authors = ["Revertron <alfis@revertron.com>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
@@ -16,12 +16,12 @@ log = "0.4.14"
|
|||||||
simplelog = "0.11.1"
|
simplelog = "0.11.1"
|
||||||
toml = "0.5.8"
|
toml = "0.5.8"
|
||||||
digest = "0.10.1"
|
digest = "0.10.1"
|
||||||
sha2 = "0.10.0"
|
sha2 = "0.10.1"
|
||||||
ed25519-dalek = "1.0"
|
ed25519-dalek = "1.0"
|
||||||
x25519-dalek = "1.2"
|
x25519-dalek = "1.2"
|
||||||
ecies-ed25519 = "0.5"
|
ecies-ed25519 = "0.5"
|
||||||
chacha20poly1305 = "0.9"
|
chacha20poly1305 = "0.9"
|
||||||
signature = "1.3.1"
|
signature = "1.5"
|
||||||
blakeout = "0.3.0"
|
blakeout = "0.3.0"
|
||||||
num_cpus = "1.13.1"
|
num_cpus = "1.13.1"
|
||||||
byteorder = "1.4.3"
|
byteorder = "1.4.3"
|
||||||
@@ -45,7 +45,7 @@ lazy_static = "1.4.0"
|
|||||||
|
|
||||||
# Optional dependencies regulated by features
|
# Optional dependencies regulated by features
|
||||||
web-view = { version = "0.7.3", features = [], optional = true }
|
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 }
|
open = { version = "2.0.2", optional = true }
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[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 LOG_REFRESH_DELAY_SEC: u64 = 60;
|
||||||
|
|
||||||
pub const POLL_TIMEOUT: Option<Duration> = Some(Duration::from_millis(500));
|
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
|
/// We start syncing blocks only when we got 4 and more connected nodes
|
||||||
pub const MIN_CONNECTED_NODES_START_SYNC: usize = 4;
|
pub const MIN_CONNECTED_NODES_START_SYNC: usize = 4;
|
||||||
pub const MAX_READ_BLOCK_TIME: u128 = 100;
|
pub const MAX_READ_BLOCK_TIME: u128 = 100;
|
||||||
|
|||||||
+27
-4
@@ -4,7 +4,7 @@ extern crate serde_json;
|
|||||||
use std::cmp::max;
|
use std::cmp::max;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::io::{Error, ErrorKind, Read, Write};
|
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::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
@@ -69,6 +69,7 @@ impl Network {
|
|||||||
poll.registry().register(&mut server, SERVER, Interest::READABLE).expect("Error registering poll");
|
poll.registry().register(&mut server, SERVER, Interest::READABLE).expect("Error registering poll");
|
||||||
|
|
||||||
// Starting peer connections to bootstrap nodes
|
// 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);
|
self.peers.connect_peers(&peers_addrs, poll.registry(), &mut self.token, yggdrasil_only);
|
||||||
|
|
||||||
let mut ui_timer = Instant::now();
|
let mut ui_timer = Instant::now();
|
||||||
@@ -82,6 +83,7 @@ impl Network {
|
|||||||
loop {
|
loop {
|
||||||
if self.peers.get_peers_count() == 0 && bootstrap_timer.elapsed().as_secs() > 60 {
|
if self.peers.get_peers_count() == 0 && bootstrap_timer.elapsed().as_secs() > 60 {
|
||||||
warn!("Restarting swarm connections...");
|
warn!("Restarting swarm connections...");
|
||||||
|
wait_for_internet(WAIT_FOR_INTERNET);
|
||||||
// Starting peer connections to bootstrap nodes
|
// Starting peer connections to bootstrap nodes
|
||||||
self.peers.connect_peers(&peers_addrs, poll.registry(), &mut self.token, yggdrasil_only);
|
self.peers.connect_peers(&peers_addrs, poll.registry(), &mut self.token, yggdrasil_only);
|
||||||
bootstrap_timer = Instant::now();
|
bootstrap_timer = Instant::now();
|
||||||
@@ -146,9 +148,7 @@ impl Network {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !events.is_empty() {
|
if last_events_time.elapsed().as_secs() > MAX_IDLE_SECONDS {
|
||||||
last_events_time = Instant::now();
|
|
||||||
} else if last_events_time.elapsed().as_secs() > MAX_IDLE_SECONDS {
|
|
||||||
if self.peers.get_peers_count() > 0 {
|
if self.peers.get_peers_count() > 0 {
|
||||||
warn!("Something is wrong with swarm connections, closing all.");
|
warn!("Something is wrong with swarm connections, closing all.");
|
||||||
self.peers.close_all_peers(poll.registry());
|
self.peers.close_all_peers(poll.registry());
|
||||||
@@ -156,6 +156,8 @@ impl Network {
|
|||||||
} else {
|
} else {
|
||||||
thread::sleep(POLL_TIMEOUT.unwrap());
|
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 {
|
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()
|
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 {
|
fn would_block(err: &io::Error) -> bool {
|
||||||
err.kind() == io::ErrorKind::WouldBlock
|
err.kind() == io::ErrorKind::WouldBlock
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-10
@@ -1,8 +1,8 @@
|
|||||||
use std::cmp::min;
|
use std::cmp::min;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::io;
|
use std::{io, thread};
|
||||||
use std::net::{IpAddr, Shutdown, SocketAddr, ToSocketAddrs};
|
use std::net::{IpAddr, Shutdown, SocketAddr, ToSocketAddrs};
|
||||||
use std::time::Instant;
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
#[allow(unused_imports)]
|
#[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) {
|
pub fn connect_peers(&mut self, peers_addrs: &[String], registry: &Registry, unique_token: &mut Token, yggdrasil_only: bool) {
|
||||||
let mut set = HashSet::new();
|
let mut set = HashSet::new();
|
||||||
for peer in peers_addrs.iter() {
|
for peer in peers_addrs.iter() {
|
||||||
info!("Resolving address {}", peer);
|
// At first we connect to 10 peer addresses
|
||||||
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
|
|
||||||
if set.len() >= 10 {
|
if set.len() >= 10 {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut addresses = Self::resolve(peer);
|
||||||
while !addresses.is_empty() {
|
while !addresses.is_empty() {
|
||||||
let addr = addresses.remove(0);
|
let addr = addresses.remove(0);
|
||||||
if !set.contains(&addr) {
|
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<()> {
|
fn connect_peer(&mut self, addr: &SocketAddr, registry: &Registry, unique_token: &mut Token, yggdrasil_only: bool) -> io::Result<()> {
|
||||||
if self.ignored.contains(&addr.ip()) {
|
if self.ignored.contains(&addr.ip()) {
|
||||||
return Err(io::Error::from(io::ErrorKind::ConnectionAborted));
|
return Err(io::Error::from(io::ErrorKind::ConnectionAborted));
|
||||||
|
|||||||
Reference in New Issue
Block a user