Skip to content

Commit 8b991c3

Browse files
committed
Consider received timestamp filters when sharing gossip
1 parent 299b7bd commit 8b991c3

File tree

1 file changed

+37
-12
lines changed

1 file changed

+37
-12
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ struct Peer {
586586
msgs_sent_since_pong: usize,
587587
awaiting_pong_timer_tick_intervals: i64,
588588
received_message_since_timer_tick: bool,
589-
sent_gossip_timestamp_filter: bool,
589+
sent_gossip_timestamp_filter: Option<msgs::GossipTimestampFilter>,
590590

591591
/// Indicates we've received a `channel_announcement` since the last time we had
592592
/// [`PeerManager::gossip_processing_backlogged`] set (or, really, that we've received a
@@ -614,7 +614,7 @@ impl Peer {
614614
fn should_forward_channel_announcement(&self, channel_id: u64) -> bool {
615615
if !self.handshake_complete() { return false; }
616616
if self.their_features.as_ref().unwrap().supports_gossip_queries() &&
617-
!self.sent_gossip_timestamp_filter {
617+
self.sent_gossip_timestamp_filter.is_none() {
618618
return false;
619619
}
620620
match self.sync_status {
@@ -628,7 +628,7 @@ impl Peer {
628628
fn should_forward_node_announcement(&self, node_id: NodeId) -> bool {
629629
if !self.handshake_complete() { return false; }
630630
if self.their_features.as_ref().unwrap().supports_gossip_queries() &&
631-
!self.sent_gossip_timestamp_filter {
631+
self.sent_gossip_timestamp_filter.is_none() {
632632
return false;
633633
}
634634
match self.sync_status {
@@ -1123,7 +1123,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
11231123
msgs_sent_since_pong: 0,
11241124
awaiting_pong_timer_tick_intervals: 0,
11251125
received_message_since_timer_tick: false,
1126-
sent_gossip_timestamp_filter: false,
1126+
sent_gossip_timestamp_filter: None,
11271127

11281128
received_channel_announce_since_backlogged: false,
11291129
inbound_connection: false,
@@ -1179,7 +1179,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
11791179
msgs_sent_since_pong: 0,
11801180
awaiting_pong_timer_tick_intervals: 0,
11811181
received_message_since_timer_tick: false,
1182-
sent_gossip_timestamp_filter: false,
1182+
sent_gossip_timestamp_filter: None,
11831183

11841184
received_channel_announce_since_backlogged: false,
11851185
inbound_connection: true,
@@ -1224,12 +1224,30 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
12241224
if let Some((announce, update_a_option, update_b_option)) =
12251225
self.message_handler.route_handler.get_next_channel_announcement(c)
12261226
{
1227-
self.enqueue_message(peer, &announce);
1227+
let (min, max) = peer.sent_gossip_timestamp_filter.as_ref().map_or((0, u32::MAX), |f| {
1228+
(f.first_timestamp, f.first_timestamp.saturating_add(f.timestamp_range))
1229+
});
1230+
1231+
// we only wish to enqueue the announcement if at least one directional
1232+
// update is going to accompany it
1233+
let mut has_enqueued_announcement = false;
1234+
12281235
if let Some(update_a) = update_a_option {
1229-
self.enqueue_message(peer, &update_a);
1236+
if update_a.contents.timestamp >= min && update_a.contents.timestamp <= max {
1237+
if !has_enqueued_announcement {
1238+
self.enqueue_message(peer, &announce);
1239+
has_enqueued_announcement = true;
1240+
}
1241+
self.enqueue_message(peer, &update_a);
1242+
}
12301243
}
12311244
if let Some(update_b) = update_b_option {
1232-
self.enqueue_message(peer, &update_b);
1245+
if update_b.contents.timestamp >= min && update_b.contents.timestamp <= max {
1246+
if !has_enqueued_announcement {
1247+
self.enqueue_message(peer, &announce);
1248+
}
1249+
self.enqueue_message(peer, &update_b);
1250+
}
12331251
}
12341252
peer.sync_status = InitSyncTracker::ChannelsSyncing(announce.contents.short_channel_id + 1);
12351253
} else {
@@ -1238,7 +1256,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
12381256
},
12391257
InitSyncTracker::ChannelsSyncing(c) if c == 0xffff_ffff_ffff_ffff => {
12401258
if let Some(msg) = self.message_handler.route_handler.get_next_node_announcement(None) {
1241-
self.enqueue_message(peer, &msg);
1259+
let (min, max) = peer.sent_gossip_timestamp_filter.as_ref().map_or((0, u32::MAX), |f| {
1260+
(f.first_timestamp, f.first_timestamp.saturating_add(f.timestamp_range))
1261+
});
1262+
1263+
if msg.contents.timestamp >= min && msg.contents.timestamp <= max {
1264+
self.enqueue_message(peer, &msg);
1265+
}
1266+
12421267
peer.sync_status = InitSyncTracker::NodesSyncing(msg.contents.node_id);
12431268
} else {
12441269
peer.sync_status = InitSyncTracker::NoSyncRequested;
@@ -1722,12 +1747,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
17221747
return Err(PeerHandleError { }.into());
17231748
}
17241749

1725-
if let wire::Message::GossipTimestampFilter(_msg) = message {
1750+
if let wire::Message::GossipTimestampFilter(msg) = message {
17261751
// When supporting gossip messages, start initial gossip sync only after we receive
17271752
// a GossipTimestampFilter
17281753
if peer_lock.their_features.as_ref().unwrap().supports_gossip_queries() &&
1729-
!peer_lock.sent_gossip_timestamp_filter {
1730-
peer_lock.sent_gossip_timestamp_filter = true;
1754+
peer_lock.sent_gossip_timestamp_filter.is_none() {
1755+
peer_lock.sent_gossip_timestamp_filter = Some(msg);
17311756
peer_lock.sync_status = InitSyncTracker::ChannelsSyncing(0);
17321757
}
17331758
return Ok(None);

0 commit comments

Comments
 (0)