Skip to content

Commit 2920f03

Browse files
committed
Provide ConnectionNeeded events from PeerManager
OnionMessageHandler may signal to PeerManager that it is buffering onion messages for non-peer nodes. Have PeerManager query it and provide ConnectionNeeded events for those nodes. Once the user processes such an event by connecting to the node, the buffered onion messages will be processed as usual.
1 parent 257700b commit 2920f03

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use bitcoin::blockdata::constants::ChainHash;
1919
use bitcoin::secp256k1::{self, Secp256k1, SecretKey, PublicKey};
2020

2121
use crate::sign::{KeysManager, NodeSigner, Recipient};
22-
use crate::events::{MessageSendEvent, MessageSendEventsProvider};
22+
use crate::events::{Event, EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
2323
use crate::ln::ChannelId;
2424
use crate::ln::features::{InitFeatures, NodeFeatures};
2525
use crate::ln::msgs;
@@ -749,6 +749,9 @@ pub struct PeerManager<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: D
749749
/// it finishes as another thread tried to start processing events but returned early.
750750
event_processing_state: AtomicI32,
751751

752+
/// Events (as opposed to MessageSendEvents) needing processing.
753+
pending_events: Mutex<Vec<Event>>,
754+
752755
/// Used to track the last value sent in a node_announcement "timestamp" field. We ensure this
753756
/// value increases strictly since we don't assume access to a time source.
754757
last_node_announcement_serial: AtomicU32,
@@ -918,6 +921,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
918921
peers: FairRwLock::new(HashMap::new()),
919922
node_id_to_descriptor: Mutex::new(HashMap::new()),
920923
event_processing_state: AtomicI32::new(0),
924+
pending_events: Mutex::new(Vec::new()),
921925
ephemeral_key_midstate,
922926
peer_counter: AtomicCounter::new(),
923927
gossip_processing_backlogged: AtomicBool::new(false),
@@ -2396,6 +2400,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
23962400
}
23972401
}
23982402
}
2403+
2404+
let nodes_to_connect =
2405+
self.message_handler.onion_message_handler.release_pending_connections();
2406+
let mut pending_events = self.pending_events.lock().unwrap();
2407+
for node_announcement in nodes_to_connect {
2408+
pending_events.push(Event::ConnectionNeeded { node_announcement });
2409+
}
23992410
}
24002411

24012412
#[allow(dead_code)]
@@ -2482,6 +2493,24 @@ fn is_gossip_msg(type_id: u16) -> bool {
24822493
}
24832494
}
24842495

2496+
impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CMH: Deref, NS: Deref>
2497+
EventsProvider for PeerManager<Descriptor, CM, RM, OM, L, CMH, NS>
2498+
where
2499+
CM::Target: ChannelMessageHandler,
2500+
RM::Target: RoutingMessageHandler,
2501+
OM::Target: OnionMessageHandler,
2502+
L::Target: Logger,
2503+
CMH::Target: CustomMessageHandler,
2504+
NS::Target: NodeSigner,
2505+
{
2506+
fn process_pending_events<H: Deref>(&self, handler: H) where H::Target: EventHandler {
2507+
let pending_events = core::mem::take(&mut *self.pending_events.lock().unwrap());
2508+
for event in pending_events {
2509+
handler.handle_event(event);
2510+
}
2511+
}
2512+
}
2513+
24852514
#[cfg(test)]
24862515
mod tests {
24872516
use crate::sign::{NodeSigner, Recipient};

0 commit comments

Comments
 (0)