@@ -586,7 +586,7 @@ struct Peer {
586
586
msgs_sent_since_pong : usize ,
587
587
awaiting_pong_timer_tick_intervals : i64 ,
588
588
received_message_since_timer_tick : bool ,
589
- sent_gossip_timestamp_filter : bool ,
589
+ sent_gossip_timestamp_filter : Option < msgs :: GossipTimestampFilter > ,
590
590
591
591
/// Indicates we've received a `channel_announcement` since the last time we had
592
592
/// [`PeerManager::gossip_processing_backlogged`] set (or, really, that we've received a
@@ -614,7 +614,7 @@ impl Peer {
614
614
fn should_forward_channel_announcement ( & self , channel_id : u64 ) -> bool {
615
615
if !self . handshake_complete ( ) { return false ; }
616
616
if self . their_features . as_ref ( ) . unwrap ( ) . supports_gossip_queries ( ) &&
617
- ! self . sent_gossip_timestamp_filter {
617
+ self . sent_gossip_timestamp_filter . is_none ( ) {
618
618
return false ;
619
619
}
620
620
match self . sync_status {
@@ -628,7 +628,7 @@ impl Peer {
628
628
fn should_forward_node_announcement ( & self , node_id : NodeId ) -> bool {
629
629
if !self . handshake_complete ( ) { return false ; }
630
630
if self . their_features . as_ref ( ) . unwrap ( ) . supports_gossip_queries ( ) &&
631
- ! self . sent_gossip_timestamp_filter {
631
+ self . sent_gossip_timestamp_filter . is_none ( ) {
632
632
return false ;
633
633
}
634
634
match self . sync_status {
@@ -1123,7 +1123,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1123
1123
msgs_sent_since_pong : 0 ,
1124
1124
awaiting_pong_timer_tick_intervals : 0 ,
1125
1125
received_message_since_timer_tick : false ,
1126
- sent_gossip_timestamp_filter : false ,
1126
+ sent_gossip_timestamp_filter : None ,
1127
1127
1128
1128
received_channel_announce_since_backlogged : false ,
1129
1129
inbound_connection : false ,
@@ -1179,7 +1179,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1179
1179
msgs_sent_since_pong : 0 ,
1180
1180
awaiting_pong_timer_tick_intervals : 0 ,
1181
1181
received_message_since_timer_tick : false ,
1182
- sent_gossip_timestamp_filter : false ,
1182
+ sent_gossip_timestamp_filter : None ,
1183
1183
1184
1184
received_channel_announce_since_backlogged : false ,
1185
1185
inbound_connection : true ,
@@ -1224,12 +1224,30 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1224
1224
if let Some ( ( announce, update_a_option, update_b_option) ) =
1225
1225
self . message_handler . route_handler . get_next_channel_announcement ( c)
1226
1226
{
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
+
1228
1235
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
+ }
1230
1243
}
1231
1244
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
+ }
1233
1251
}
1234
1252
peer. sync_status = InitSyncTracker :: ChannelsSyncing ( announce. contents . short_channel_id + 1 ) ;
1235
1253
} else {
@@ -1238,7 +1256,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1238
1256
} ,
1239
1257
InitSyncTracker :: ChannelsSyncing ( c) if c == 0xffff_ffff_ffff_ffff => {
1240
1258
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
+
1242
1267
peer. sync_status = InitSyncTracker :: NodesSyncing ( msg. contents . node_id ) ;
1243
1268
} else {
1244
1269
peer. sync_status = InitSyncTracker :: NoSyncRequested ;
@@ -1722,12 +1747,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1722
1747
return Err ( PeerHandleError { } . into ( ) ) ;
1723
1748
}
1724
1749
1725
- if let wire:: Message :: GossipTimestampFilter ( _msg ) = message {
1750
+ if let wire:: Message :: GossipTimestampFilter ( msg ) = message {
1726
1751
// When supporting gossip messages, start initial gossip sync only after we receive
1727
1752
// a GossipTimestampFilter
1728
1753
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 ) ;
1731
1756
peer_lock. sync_status = InitSyncTracker :: ChannelsSyncing ( 0 ) ;
1732
1757
}
1733
1758
return Ok ( None ) ;
0 commit comments