Skip to content

Commit 57c286f

Browse files
committed
Skip forwarding gossip messages to peers if their buffer is over-full
1 parent c56cd1e commit 57c286f

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,15 @@ enum InitSyncTracker{
233233
NodesSyncing(PublicKey),
234234
}
235235

236+
/// When the outbound buffer has this many messages, we'll stop reading bytes from the peer until
237+
/// we manage to send messages until we reach this limit.
238+
/// We also use this as the target number of outbound gossip messages to keep in the write buffer,
239+
/// refilled as we send bytes.
240+
const OUTBOUND_BUFFER_LIMIT_READ_PAUSE: usize = 10;
241+
/// When the outbound buffer has this many messages, we'll simply skip relaying gossip messages to
242+
/// the peer.
243+
const OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP: usize = 20;
244+
236245
struct Peer {
237246
channel_encryptor: PeerChannelEncryptor,
238247
their_node_id: Option<PublicKey>,
@@ -531,13 +540,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
531540
}
532541
}
533542
}
534-
const MSG_BUFF_SIZE: usize = 10;
535543
while !peer.awaiting_write_event {
536-
if peer.pending_outbound_buffer.len() < MSG_BUFF_SIZE {
544+
if peer.pending_outbound_buffer.len() < OUTBOUND_BUFFER_LIMIT_READ_PAUSE {
537545
match peer.sync_status {
538546
InitSyncTracker::NoSyncRequested => {},
539547
InitSyncTracker::ChannelsSyncing(c) if c < 0xffff_ffff_ffff_ffff => {
540-
let steps = ((MSG_BUFF_SIZE - peer.pending_outbound_buffer.len() + 2) / 3) as u8;
548+
let steps = ((OUTBOUND_BUFFER_LIMIT_READ_PAUSE - peer.pending_outbound_buffer.len() + 2) / 3) as u8;
541549
let all_messages = self.message_handler.route_handler.get_next_channel_announcements(c, steps);
542550
for &(ref announce, ref update_a_option, ref update_b_option) in all_messages.iter() {
543551
encode_and_send_msg!(announce);
@@ -554,7 +562,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
554562
}
555563
},
556564
InitSyncTracker::ChannelsSyncing(c) if c == 0xffff_ffff_ffff_ffff => {
557-
let steps = (MSG_BUFF_SIZE - peer.pending_outbound_buffer.len()) as u8;
565+
let steps = (OUTBOUND_BUFFER_LIMIT_READ_PAUSE - peer.pending_outbound_buffer.len()) as u8;
558566
let all_messages = self.message_handler.route_handler.get_next_node_announcements(None, steps);
559567
for msg in all_messages.iter() {
560568
encode_and_send_msg!(msg);
@@ -566,7 +574,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
566574
},
567575
InitSyncTracker::ChannelsSyncing(_) => unreachable!(),
568576
InitSyncTracker::NodesSyncing(key) => {
569-
let steps = (MSG_BUFF_SIZE - peer.pending_outbound_buffer.len()) as u8;
577+
let steps = (OUTBOUND_BUFFER_LIMIT_READ_PAUSE - peer.pending_outbound_buffer.len()) as u8;
570578
let all_messages = self.message_handler.route_handler.get_next_node_announcements(Some(&key), steps);
571579
for msg in all_messages.iter() {
572580
encode_and_send_msg!(msg);
@@ -585,7 +593,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
585593
Some(buff) => buff,
586594
};
587595

588-
let should_be_reading = peer.pending_outbound_buffer.len() < MSG_BUFF_SIZE;
596+
let should_be_reading = peer.pending_outbound_buffer.len() < OUTBOUND_BUFFER_LIMIT_READ_PAUSE;
589597
let pending = &next_buff[peer.pending_outbound_buffer_first_msg_offset..];
590598
let data_sent = descriptor.send_data(pending, should_be_reading);
591599
peer.pending_outbound_buffer_first_msg_offset += data_sent;
@@ -814,7 +822,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
814822
}
815823
}
816824

817-
peer.pending_outbound_buffer.len() > 10 // pause_read
825+
peer.pending_outbound_buffer.len() > OUTBOUND_BUFFER_LIMIT_READ_PAUSE // pause_read
818826
}
819827
};
820828

@@ -1027,6 +1035,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
10271035
!peer.should_forward_channel_announcement(msg.contents.short_channel_id) {
10281036
continue
10291037
}
1038+
if peer.pending_outbound_buffer.len() > OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP {
1039+
continue;
1040+
}
10301041
if peer.their_node_id.as_ref() == Some(&msg.contents.node_id_1) ||
10311042
peer.their_node_id.as_ref() == Some(&msg.contents.node_id_2) {
10321043
continue;
@@ -1046,6 +1057,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
10461057
!peer.should_forward_node_announcement(msg.contents.node_id) {
10471058
continue
10481059
}
1060+
if peer.pending_outbound_buffer.len() > OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP {
1061+
continue;
1062+
}
10491063
if peer.their_node_id.as_ref() == Some(&msg.contents.node_id) {
10501064
continue;
10511065
}
@@ -1064,6 +1078,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
10641078
!peer.should_forward_channel_announcement(msg.contents.short_channel_id) {
10651079
continue
10661080
}
1081+
if peer.pending_outbound_buffer.len() > OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP {
1082+
continue;
1083+
}
10671084
if except_node.is_some() && peer.their_node_id.as_ref() == except_node {
10681085
continue;
10691086
}

0 commit comments

Comments
 (0)