X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Ftracking.rs;h=901339c3286ad22d156f5b5d85c486377d2027b4;hb=4c20eda0cf43a80d27bbcb66423225c7c072753a;hp=ee428e0f0acd0d1e834cc6af31e3b23dcacee6b7;hpb=66dd8c2933cc57aa2bdc8e4ca33716f6d2309b5e;p=rapid-gossip-sync-server diff --git a/src/tracking.rs b/src/tracking.rs index ee428e0..901339c 100644 --- a/src/tracking.rs +++ b/src/tracking.rs @@ -5,13 +5,12 @@ use std::ops::Deref; use std::sync::Arc; use std::time::{Duration, Instant}; -use bitcoin::hashes::hex::ToHex; use bitcoin::secp256k1::PublicKey; -use lightning; +use hex_conservative::display::DisplayHex; use lightning::ln::peer_handler::{ ErroringMessageHandler, IgnoringMessageHandler, MessageHandler, PeerManager, }; -use lightning::{log_error, log_info, log_warn}; +use lightning::{log_info, log_warn}; use lightning::routing::gossip::NetworkGraph; use lightning::sign::KeysManager; use lightning::util::logger::Logger; @@ -165,31 +164,36 @@ pub(crate) async fn download_gossip(pe } async fn connect_peer(current_peer: (PublicKey, SocketAddr), peer_manager: GossipPeerManager, logger: L) -> bool where L::Target: Logger { - log_info!(logger, "Connecting to peer {}@{}...", current_peer.0.to_hex(), current_peer.1.to_string()); - let connection = lightning_net_tokio::connect_outbound( - Arc::clone(&peer_manager), - current_peer.0, - current_peer.1, - ).await; - if let Some(disconnection_future) = connection { - log_info!(logger, "Connected to peer {}@{}!", current_peer.0.to_hex(), current_peer.1.to_string()); - tokio::spawn(async move { - disconnection_future.await; - loop { - log_warn!(logger, "Reconnecting to peer {}@{}...", current_peer.0.to_hex(), current_peer.1.to_string()); - if let Some(disconnection_future) = lightning_net_tokio::connect_outbound( - Arc::clone(&peer_manager), - current_peer.0, - current_peer.1, - ).await { - disconnection_future.await; + // we seek to find out if the first connection attempt was successful + let (sender, mut receiver) = mpsc::channel::(1); + tokio::spawn(async move { + let current_peer_pubkey_hex = current_peer.0.serialize().to_lower_hex_string(); + log_info!(logger, "Connecting to peer {}@{}...", current_peer_pubkey_hex, current_peer.1); + let mut is_first_iteration = true; + loop { + if let Some(disconnection_future) = lightning_net_tokio::connect_outbound( + Arc::clone(&peer_manager), + current_peer.0, + current_peer.1, + ).await { + log_info!(logger, "Connected to peer {}@{}!", current_peer_pubkey_hex, current_peer.1); + if is_first_iteration { + sender.send(true).await.unwrap(); + } + disconnection_future.await; + log_warn!(logger, "Disconnected from peer {}@{}", current_peer_pubkey_hex, current_peer.1); + } else { + log_warn!(logger, "Failed to connect to peer {}@{}!", current_peer_pubkey_hex, current_peer.1); + if is_first_iteration { + sender.send(false).await.unwrap(); } - tokio::time::sleep(Duration::from_secs(10)).await; } - }); - true - } else { - log_error!(logger, "Failed to connect to peer {}@{}", current_peer.0.to_hex(), current_peer.1.to_string()); - false - } + is_first_iteration = false; + tokio::time::sleep(Duration::from_secs(10)).await; + log_warn!(logger, "Reconnecting to peer {}@{}...", current_peer_pubkey_hex, current_peer.1); + } + }); + + let success = receiver.recv().await.unwrap(); + success }