Skip to content

Commit 105df12

Browse files
committed
Initialize gossip_query routing table sync on connection
This commit calls sync_routing_table when a peer has connected and should_request_full_sync is true. The sync flag must be set when the outbound Init message is sent, we capture whether we want to perform a sync with a peer in a new field, request_sync, on the Peer struct. If this flag is set, sync_routing_table is called upon receipt of the peers Init message.
1 parent 3ea3ff6 commit 105df12

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

lightning/src/ln/features.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ impl<T: sealed::GossipQueries> Features<T> {
484484
pub(crate) fn supports_gossip_queries(&self) -> bool {
485485
<T as sealed::GossipQueries>::supports_feature(&self.flags)
486486
}
487+
#[cfg(test)]
487488
pub(crate) fn clear_gossip_queries(mut self) -> Self {
488489
<T as sealed::GossipQueries>::clear_bits(&mut self.flags);
489490
self

lightning/src/ln/msgs.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,9 @@ pub trait RoutingMessageHandler : Send + Sync + events::MessageSendEventsProvide
825825
/// immediately higher (as defined by <PublicKey as Ord>::cmp) than starting_point.
826826
/// If None is provided for starting_point, we start at the first node.
827827
fn get_next_node_announcements(&self, starting_point: Option<&PublicKey>, batch_amount: u8) -> Vec<NodeAnnouncement>;
828-
/// Returns whether a full sync should be requested from a peer.
828+
/// Returns whether a full sync should be requested from a peer. The result is
829+
/// used to set the initial_routing_sync feature bit when sending an Init message.
830+
/// This feature bit is not used by some implementations in favor of using gossip_queries.
829831
fn should_request_full_sync(&self, node_id: &PublicKey) -> bool;
830832
/// Initiates routing gossip sync by querying a peer to discover channels
831833
/// and their associated routing gossip messages. This method will use a

lightning/src/ln/peer_handler.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ struct Peer {
133133
pending_read_buffer_pos: usize,
134134
pending_read_is_header: bool,
135135

136+
request_sync: bool,
136137
sync_status: InitSyncTracker,
137138

138139
awaiting_pong: bool,
@@ -327,6 +328,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
327328
pending_read_buffer_pos: 0,
328329
pending_read_is_header: false,
329330

331+
request_sync: false,
330332
sync_status: InitSyncTracker::NoSyncRequested,
331333

332334
awaiting_pong: false,
@@ -364,6 +366,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
364366
pending_read_buffer_pos: 0,
365367
pending_read_is_header: false,
366368

369+
request_sync: false,
367370
sync_status: InitSyncTracker::NoSyncRequested,
368371

369372
awaiting_pong: false,
@@ -584,8 +587,10 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
584587

585588
peer.their_node_id = Some(their_node_id);
586589
insert_node_id!();
587-
let mut features = InitFeatures::known().clear_gossip_queries();
588-
if !self.message_handler.route_handler.should_request_full_sync(&peer.their_node_id.unwrap()) {
590+
let mut features = InitFeatures::known();
591+
if self.message_handler.route_handler.should_request_full_sync(&peer.their_node_id.unwrap()) {
592+
peer.request_sync = true;
593+
} else {
589594
features.clear_initial_routing_sync();
590595
}
591596

@@ -713,15 +718,21 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
713718
}
714719

715720
if !peer.outbound {
716-
let mut features = InitFeatures::known().clear_gossip_queries();
717-
if !self.message_handler.route_handler.should_request_full_sync(&peer.their_node_id.unwrap()) {
721+
let mut features = InitFeatures::known();
722+
if self.message_handler.route_handler.should_request_full_sync(&peer.their_node_id.unwrap()) {
723+
peer.request_sync = true;
724+
} else {
718725
features.clear_initial_routing_sync();
719726
}
720727

721728
let resp = msgs::Init { features };
722729
self.enqueue_message(peers_needing_send, peer, peer_descriptor.clone(), &resp);
723730
}
724731

732+
if peer.request_sync {
733+
self.message_handler.route_handler.sync_routing_table(&peer.their_node_id.unwrap(), &msg);
734+
}
735+
725736
self.message_handler.chan_handler.peer_connected(&peer.their_node_id.unwrap(), &msg);
726737
peer.their_features = Some(msg.features);
727738
},

0 commit comments

Comments
 (0)