Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions cli/src/node/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,11 @@ impl Node {
is_single_node: bool,
) -> Result<Self> {
let base = NodeBase::builder(&node_config.base, &global_config)
.init_network(public_addr, &keys.as_secret())?
.init_storage()
.await?;
.init_network(public_addr, &keys.as_secret())?;

base.check_any_bootstrap_peer_is_alive().await;

let base = base.init_storage().await?;

let rpc_mempool_adapter = if is_single_node {
RpcMempoolAdapter {
Expand Down
38 changes: 37 additions & 1 deletion core/src/node/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ use std::path::PathBuf;
use std::sync::Arc;

use anyhow::{Context, Result};
use futures_util::future::select_ok;
use tycho_crypto::ed25519;
use tycho_network::{
DhtClient, DhtService, Network, OverlayService, PeerInfo, PeerResolver, PublicOverlay, Router,
DhtClient, DhtService, Network, NetworkExt, OverlayService, PeerInfo, PeerResolver,
PublicOverlay, Router,
};
use tycho_storage::{StorageConfig, StorageContext};
use tycho_types::models::{BlockId, ValidatorSet};
Expand Down Expand Up @@ -293,6 +295,40 @@ impl<'a> NodeBaseBuilder<'a, ()> {
}

impl<'a> NodeBaseBuilder<'a, init::Step0> {
async fn check_bootstrap_peer(&self, peer: &PeerInfo) -> Result<()> {
let request = tycho_network::Request::from_tl(tycho_network::proto::dht::rpc::GetNodeInfo);
tokio::time::timeout(
self.step.net.network.connect_timeout(),
self.step.net.network.query(&peer.id, request),
)
.await??;
Ok(())
}

pub async fn check_any_bootstrap_peer_is_alive(&self) {
let bootstrap_peers = &self.common.global_config.bootstrap_peers;
if bootstrap_peers.is_empty() {
return;
}
let local_peer_id = *self.step.net.network.peer_id();

let checks: Vec<_> = bootstrap_peers
.iter()
.filter(|peer| peer.id != local_peer_id)
.map(|peer| Box::pin(self.check_bootstrap_peer(peer)))
.collect();

let reachable_any = select_ok(checks).await.is_ok();

if !reachable_any {
panic!(
"all bootstrap peers from global config are unreachable; \
your node global config is likely stale. \
update node global config to include live bootstrap peers"
);
}
}

// TODO: Add some options here if needed.
pub async fn init_storage(self) -> Result<NodeBaseBuilder<'a, init::Step1>> {
let store = ConfiguredStorage::new(
Expand Down
5 changes: 5 additions & 0 deletions network/src/network/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use std::net::{SocketAddr, ToSocketAddrs};
use std::sync::{Arc, Weak};
use std::time::Duration;

#[cfg(target_os = "linux")]
use anyhow::Context;
Expand Down Expand Up @@ -274,6 +275,10 @@ impl Network {
pub fn max_frame_size(&self) -> usize {
self.0.config.max_frame_size.0 as usize
}

pub fn connect_timeout(&self) -> Duration {
self.0.config.connect_timeout
}
}

struct NetworkInner {
Expand Down
Loading