From 94a01c20753b1973ab2c016c3c84a21c59478169 Mon Sep 17 00:00:00 2001 From: Quinn Wilton Date: Tue, 23 Jan 2024 14:29:37 -0800 Subject: [PATCH] feat: redial `node_addresses` at an interval on connection close --- homestar-runtime/config/defaults.toml | 1 + homestar-runtime/src/event_handler.rs | 2 ++ homestar-runtime/src/event_handler/cache.rs | 6 +++++ homestar-runtime/src/event_handler/event.rs | 8 ++++++ .../src/event_handler/swarm_event.rs | 26 +++++++++++++++++++ .../src/settings/libp2p_config.rs | 4 +++ 6 files changed, 47 insertions(+) diff --git a/homestar-runtime/config/defaults.toml b/homestar-runtime/config/defaults.toml index 48181388..118cc0c7 100644 --- a/homestar-runtime/config/defaults.toml +++ b/homestar-runtime/config/defaults.toml @@ -26,6 +26,7 @@ announce_addresses = [] transport_connection_timeout = 60 max_connected_peers = 32 max_announce_addresses = 10 +dial_interval = 60 [node.network.libp2p.mdns] enable = true diff --git a/homestar-runtime/src/event_handler.rs b/homestar-runtime/src/event_handler.rs index 14460d51..2e3c7c9b 100644 --- a/homestar-runtime/src/event_handler.rs +++ b/homestar-runtime/src/event_handler.rs @@ -148,6 +148,7 @@ struct Rendezvous { // Connected peers configuration and state struct Connections { + dial_interval: Duration, peers: FnvHashMap, max_peers: u32, } @@ -190,6 +191,7 @@ where query_senders: FnvHashMap::default(), request_response_senders: FnvHashMap::default(), connections: Connections { + dial_interval: settings.libp2p.dial_interval, peers: FnvHashMap::default(), max_peers: settings.libp2p.max_connected_peers, }, diff --git a/homestar-runtime/src/event_handler/cache.rs b/homestar-runtime/src/event_handler/cache.rs index a4fedb8b..10e5b89a 100644 --- a/homestar-runtime/src/event_handler/cache.rs +++ b/homestar-runtime/src/event_handler/cache.rs @@ -51,6 +51,7 @@ pub(crate) enum CacheData { pub(crate) enum DispatchEvent { RegisterPeer, DiscoverPeers, + DialPeer, } /// Setup a cache with an eviction listener. @@ -78,6 +79,11 @@ pub(crate) fn setup_cache( let _ = tx.send(Event::DiscoverPeers(rendezvous_node.to_owned())); }; } + DispatchEvent::DialPeer => { + if let Some(CacheData::Peer(node)) = val.data.get("node") { + let _ = tx.send(Event::DialPeer(node.to_owned())); + }; + } } } }; diff --git a/homestar-runtime/src/event_handler/event.rs b/homestar-runtime/src/event_handler/event.rs index a239b05e..ce095e7e 100644 --- a/homestar-runtime/src/event_handler/event.rs +++ b/homestar-runtime/src/event_handler/event.rs @@ -132,6 +132,8 @@ pub(crate) enum Event { DiscoverPeers(PeerId), /// Dynamically get listeners for the swarm. GetNodeInfo(AsyncChannelSender), + /// Dial a peer. + DialPeer(PeerId), } #[allow(unreachable_patterns)] @@ -293,6 +295,12 @@ impl Event { ); } } + Event::DialPeer(peer_id) => { + event_handler + .swarm + .dial(peer_id) + .map_err(anyhow::Error::new)?; + } _ => {} } Ok(()) diff --git a/homestar-runtime/src/event_handler/swarm_event.rs b/homestar-runtime/src/event_handler/swarm_event.rs index b8a3d0e1..3dc75500 100644 --- a/homestar-runtime/src/event_handler/swarm_event.rs +++ b/homestar-runtime/src/event_handler/swarm_event.rs @@ -1157,6 +1157,32 @@ async fn handle_swarm_event( peer_id = peer_id.to_string(), "removed peer from kademlia table" ); + } else { + debug!( + subject = "libp2p.conn.closed", + category = "handle_swarm_event", + peer_id = peer_id.to_string(), + "redialing trusted peer in {interval:?}", + interval = event_handler.connections.dial_interval + ); + + // Dial peers again at dial interval + event_handler + .cache + .insert( + format!("{}-dial", peer_id), + CacheValue::new( + event_handler.connections.dial_interval, + HashMap::from([ + ( + "on_expiration".to_string(), + CacheData::OnExpiration(cache::DispatchEvent::DialPeer), + ), + ("node".to_string(), CacheData::Peer(peer_id)), + ]), + ), + ) + .await; } #[cfg(feature = "websocket-notify")] diff --git a/homestar-runtime/src/settings/libp2p_config.rs b/homestar-runtime/src/settings/libp2p_config.rs index 733e5465..d3ced760 100644 --- a/homestar-runtime/src/settings/libp2p_config.rs +++ b/homestar-runtime/src/settings/libp2p_config.rs @@ -39,6 +39,9 @@ pub(crate) struct Libp2p { /// Transport connection timeout. #[serde_as(as = "DurationSeconds")] pub(crate) transport_connection_timeout: Duration, + /// Dial interval. + #[serde_as(as = "DurationSeconds")] + pub(crate) dial_interval: Duration, } /// DHT settings. @@ -138,6 +141,7 @@ impl Default for Libp2p { pubsub: Pubsub::default(), rendezvous: Rendezvous::default(), transport_connection_timeout: Duration::new(60, 0), + dial_interval: Duration::new(60, 0), } } }