diff --git a/Cargo.lock b/Cargo.lock index b1d01ae5e6..49fcae7f95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "nym-client" -version = "0.3.0" +version = "0.3.1" dependencies = [ "addressing", "base64 0.11.0", @@ -1372,7 +1372,7 @@ dependencies = [ [[package]] name = "nym-mixnode" -version = "0.3.0" +version = "0.3.1" dependencies = [ "addressing", "base64 0.11.0", @@ -1381,13 +1381,14 @@ dependencies = [ "curve25519-dalek", "directory-client", "futures 0.3.1", + "log", "sphinx", "tokio 0.2.9", ] [[package]] name = "nym-sfw-provider" -version = "0.3.0" +version = "0.3.1" dependencies = [ "base64 0.11.0", "built", @@ -1398,6 +1399,7 @@ dependencies = [ "futures 0.3.1", "hex", "hmac", + "log", "rand 0.7.2", "serde", "serde_json", diff --git a/mixnode/CHANGELOG.md b/mixnode/CHANGELOG.md index ca1ccd00b5..553a967807 100644 --- a/mixnode/CHANGELOG.md +++ b/mixnode/CHANGELOG.md @@ -1,5 +1,9 @@ # nym-mixnode Changelog +## 0.3.1 + +* Fixed crash when directory server goes down + ## 0.3.0 * cleaned up a lot of internal dependencies diff --git a/mixnode/Cargo.toml b/mixnode/Cargo.toml index 84097d012e..32859e847a 100644 --- a/mixnode/Cargo.toml +++ b/mixnode/Cargo.toml @@ -1,7 +1,7 @@ [package] build = "build.rs" name = "nym-mixnode" -version = "0.3.0" +version = "0.3.1" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] edition = "2018" @@ -12,6 +12,7 @@ base64 = "0.11.0" clap = "2.33.0" curve25519-dalek = "1.2.3" futures = "0.3.1" +log = "0.4.8" tokio = { version = "0.2", features = ["full"] } ## internal diff --git a/mixnode/src/node/metrics.rs b/mixnode/src/node/metrics.rs index db737a2c7d..adc1d74e48 100644 --- a/mixnode/src/node/metrics.rs +++ b/mixnode/src/node/metrics.rs @@ -4,6 +4,7 @@ use directory_client::DirectoryClient; use futures::channel::mpsc; use futures::lock::Mutex; use futures::StreamExt; +use log::{debug, error}; use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; @@ -80,14 +81,15 @@ impl MetricsReporter { tokio::time::delay_for(delay_duration).await; let (received, sent) = MetricsReporter::acquire_and_reset_metrics(metrics.clone()).await; - directory_client - .metrics_post - .post(&MixMetric { - pub_key: pub_key_str.clone(), - received, - sent, - }) - .unwrap(); + + match directory_client.metrics_post.post(&MixMetric { + pub_key: pub_key_str.clone(), + received, + sent, + }) { + Err(err) => error!("failed to send metrics - {:?}", err), + Ok(_) => debug!("sent metrics information"), + } } } } diff --git a/mixnode/src/node/mod.rs b/mixnode/src/node/mod.rs index a2546d279a..f6e151803d 100644 --- a/mixnode/src/node/mod.rs +++ b/mixnode/src/node/mod.rs @@ -1,4 +1,5 @@ use crate::mix_peer::MixPeer; +use crate::node; use crate::node::metrics::MetricsReporter; use curve25519_dalek::montgomery::MontgomeryPoint; use curve25519_dalek::scalar::Scalar; @@ -214,7 +215,7 @@ impl MixNode { } } - pub fn start(&self) -> Result<(), Box> { + pub fn start(&self, config: node::Config) -> Result<(), Box> { // Create the runtime, probably later move it to MixNode itself? let mut rt = Runtime::new()?; @@ -227,6 +228,11 @@ impl MixNode { let pub_key_str = base64::encode_config(&self.public_key.to_bytes().to_vec(), base64::URL_SAFE); + rt.spawn({ + let presence_notifier = presence::Notifier::new(&config); + presence_notifier.run() + }); + let metrics = MetricsReporter::new().add_arc_mutex(); rt.spawn(MetricsReporter::run_received_metrics_control( metrics.clone(), diff --git a/mixnode/src/node/presence.rs b/mixnode/src/node/presence.rs index 18fcd66136..678d8af880 100644 --- a/mixnode/src/node/presence.rs +++ b/mixnode/src/node/presence.rs @@ -2,7 +2,7 @@ use crate::node; use directory_client::presence::MixNodePresence; use directory_client::requests::presence_mixnodes_post::PresenceMixNodesPoster; use directory_client::DirectoryClient; -use std::thread; +use log::{debug, error}; use std::time::Duration; pub struct Notifier { @@ -30,16 +30,18 @@ impl Notifier { } pub fn notify(&self) { - self.net_client - .presence_mix_nodes_post - .post(&self.presence) - .unwrap(); + match self.net_client.presence_mix_nodes_post.post(&self.presence) { + Err(err) => error!("failed to send presence - {:?}", err), + Ok(_) => debug!("sent presence information"), + } } - pub fn run(&self) { + pub async fn run(self) { + let delay_duration = Duration::from_secs(5); + loop { self.notify(); - thread::sleep(Duration::from_secs(5)); + tokio::time::delay_for(delay_duration).await; } } } diff --git a/mixnode/src/node/runner.rs b/mixnode/src/node/runner.rs index 93b16381ab..8f120cc0a7 100644 --- a/mixnode/src/node/runner.rs +++ b/mixnode/src/node/runner.rs @@ -1,11 +1,8 @@ use crate::banner; use crate::node; -use crate::node::presence; use crate::node::MixNode; use clap::ArgMatches; - use std::net::ToSocketAddrs; -use std::thread; fn print_binding_warning(address: &str) { println!("\n##### WARNING #####"); @@ -29,11 +26,7 @@ pub fn start(matches: &ArgMatches) { ); let mix = MixNode::new(&config); - thread::spawn(move || { - let notifier = presence::Notifier::new(&config); - notifier.run(); - }); - mix.start().unwrap(); + mix.start(config).unwrap(); } fn new_config(matches: &ArgMatches) -> node::Config { diff --git a/nym-client/CHANGELOG.md b/nym-client/CHANGELOG.md index 798a6b9175..02c638b629 100644 --- a/nym-client/CHANGELOG.md +++ b/nym-client/CHANGELOG.md @@ -1,5 +1,9 @@ # nym-client Changelog +## 0.3.1 + +* Version increase for consistency with `nym-mixnode` and `nym-sfw-provider` + ## 0.3.0 * cleaned up a lot of internal dependencies diff --git a/nym-client/Cargo.toml b/nym-client/Cargo.toml index 913a1a7ad3..4c52dbd0fb 100644 --- a/nym-client/Cargo.toml +++ b/nym-client/Cargo.toml @@ -1,7 +1,7 @@ [package] build = "build.rs" name = "nym-client" -version = "0.3.0" +version = "0.3.1" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] edition = "2018" diff --git a/sample-configs/validator-config.toml.sample b/sample-configs/validator-config.toml.sample index ec7be28f32..c60c223287 100644 --- a/sample-configs/validator-config.toml.sample +++ b/sample-configs/validator-config.toml.sample @@ -1,7 +1,7 @@ [healthcheck] -directory-server = "http://localhost:8080" -#directory-server = "https://directory.nymtech.net" +#directory-server = "http://localhost:8080" +directory-server = "https://qa-directory.nymtech.net" interval = 10.0 test-packets-per-node = 2 # in seconds resolution-timeout = 5 # in seconds \ No newline at end of file diff --git a/sfw-provider/CHANGELOG.md b/sfw-provider/CHANGELOG.md index 350d7f519a..6379cbed8a 100644 --- a/sfw-provider/CHANGELOG.md +++ b/sfw-provider/CHANGELOG.md @@ -1,5 +1,9 @@ # nym-sfw-provider Changelog +## 0.3.1 + +* Fixed crash when directory server goes down + ## 0.3.0 * cleaned up a lot of internal dependencies diff --git a/sfw-provider/Cargo.toml b/sfw-provider/Cargo.toml index 214aaaa8ca..2ab7cc691f 100644 --- a/sfw-provider/Cargo.toml +++ b/sfw-provider/Cargo.toml @@ -1,7 +1,7 @@ [package] build = "build.rs" name = "nym-sfw-provider" -version = "0.3.0" +version = "0.3.1" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] edition = "2018" @@ -13,6 +13,7 @@ clap = "2.33.0" curve25519-dalek = "1.2.3" hex = "0.4.0" futures = "0.3.1" +log = "0.4.8" rand = "0.7.2" tokio = { version = "0.2.4", features = ["full"] } sha2 = "0.8.0" diff --git a/sfw-provider/src/provider/presence.rs b/sfw-provider/src/provider/presence.rs index 94abc77c54..567b0a56dc 100644 --- a/sfw-provider/src/provider/presence.rs +++ b/sfw-provider/src/provider/presence.rs @@ -4,6 +4,7 @@ use directory_client::presence::MixProviderPresence; use directory_client::requests::presence_providers_post::PresenceMixProviderPoster; use directory_client::DirectoryClient; use futures::lock::Mutex as FMutex; +use log::{debug, error}; use std::net::SocketAddr; use std::sync::Arc; use std::time::Duration; @@ -52,10 +53,10 @@ impl Notifier { } pub fn notify(&self, presence: MixProviderPresence) { - self.net_client - .presence_providers_post - .post(&presence) - .unwrap(); + match self.net_client.presence_providers_post.post(&presence) { + Err(err) => error!("failed to send presence - {:?}", err), + Ok(_) => debug!("sent presence information"), + } } pub async fn run(self) {