Skip to content

Commit add5880

Browse files
committed
Persist peer info from inbound channel requests
When we get an inbound channel request, we dont persist the peer info who initiated the request. In this commit, we use `[LdkEvent::ChannelPending]` to track channels that are inbound and their counterparty node id is not persisted, and if so, we add their `PeerInfo` to `PeerStore`. Notice that in order to persist this kind of data, we need first to get the listening address of the counterparty node, which is not always available, in that case we dont persist the peer info.
1 parent 87217de commit add5880

File tree

2 files changed

+67
-3
lines changed

2 files changed

+67
-3
lines changed

src/event.rs

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
use crate::peer_store::{PeerInfo, PeerStore};
12
use crate::{
2-
hex_utils, ChannelManager, Config, Error, KeysManager, NetworkGraph, UserChannelId, Wallet,
3+
hex_utils, ChannelManager, Config, Error, FilesystemLogger, KeysManager, NetworkGraph,
4+
UserChannelId, Wallet,
35
};
46

57
use crate::payment_store::{
@@ -251,6 +253,7 @@ where
251253
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>,
252254
logger: L,
253255
config: Arc<Config>,
256+
peer_store: Arc<PeerStore<K, Arc<FilesystemLogger>>>,
254257
}
255258

256259
impl<K: KVStore + Sync + Send + 'static, L: Deref> EventHandler<K, L>
@@ -262,6 +265,7 @@ where
262265
channel_manager: Arc<ChannelManager<K>>, network_graph: Arc<NetworkGraph>,
263266
keys_manager: Arc<KeysManager>, payment_store: Arc<PaymentStore<K, L>>,
264267
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>, logger: L, config: Arc<Config>,
268+
peer_store: Arc<PeerStore<K, Arc<FilesystemLogger>>>,
265269
) -> Self {
266270
Self {
267271
event_queue,
@@ -273,6 +277,7 @@ where
273277
logger,
274278
runtime,
275279
config,
280+
peer_store,
276281
}
277282
}
278283

@@ -739,6 +744,57 @@ where
739744
log_error!(self.logger, "Failed to push to event queue: {}", e);
740745
panic!("Failed to push to event queue");
741746
});
747+
let network_graph = self.network_graph.read_only();
748+
let channels =
749+
self.channel_manager.list_channels_with_counterparty(&counterparty_node_id);
750+
if let Some(pending_channel) =
751+
channels.into_iter().find(|c| c.channel_id == channel_id)
752+
{
753+
if !pending_channel.is_outbound
754+
&& self.peer_store.get_peer(&counterparty_node_id).is_none()
755+
{
756+
let nodes = network_graph.nodes();
757+
if let Some(node_info) =
758+
nodes.get(&NodeId::from_pubkey(&counterparty_node_id))
759+
{
760+
let ann_info = match node_info.announcement_info.clone() {
761+
Some(ann_info) => ann_info,
762+
None => {
763+
log_error!(self.logger,
764+
"Failed to add peer {} to peer store: no network address found",
765+
counterparty_node_id);
766+
return;
767+
}
768+
};
769+
let address =
770+
match ann_info.addresses().first() {
771+
Some(address) => address,
772+
None => {
773+
log_error!(self.logger, "Failed to add peer {} to peer store: no network address
774+
found", counterparty_node_id);
775+
return;
776+
}
777+
};
778+
let peer = PeerInfo {
779+
node_id: counterparty_node_id,
780+
address: address.clone(),
781+
};
782+
match self.peer_store.add_peer(peer) {
783+
Ok(_) => log_info!(
784+
self.logger,
785+
"Added peer {} to peer store",
786+
counterparty_node_id
787+
),
788+
Err(e) => log_error!(
789+
self.logger,
790+
"Failed to add peer {} to peer store: {}",
791+
counterparty_node_id,
792+
e
793+
),
794+
};
795+
}
796+
}
797+
}
742798
}
743799
LdkEvent::ChannelReady {
744800
channel_id, user_channel_id, counterparty_node_id, ..

src/lib.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,13 +570,20 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
570570
.filter(|id| !pm_peers.contains(id))
571571
{
572572
if let Some(peer_info) = connect_peer_store.get_peer(&node_id) {
573-
let _ = do_connect_peer(
573+
match do_connect_peer(
574574
peer_info.node_id,
575575
peer_info.address,
576576
Arc::clone(&connect_pm),
577577
Arc::clone(&connect_logger),
578578
)
579-
.await;
579+
.await {
580+
Ok(_) => {
581+
log_info!(connect_logger, "Successfully reconnected to peer {}", node_id);
582+
}
583+
Err(e) => {
584+
log_error!(connect_logger, "Failed to connect to peer: {}", e);
585+
}
586+
}
580587
}
581588
}
582589
}
@@ -656,6 +663,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
656663
Arc::clone(&self.runtime),
657664
Arc::clone(&self.logger),
658665
Arc::clone(&self.config),
666+
Arc::clone(&self.peer_store),
659667
));
660668

661669
// Setup background processing

0 commit comments

Comments
 (0)