Skip to content

Commit a6fcb74

Browse files
committed
Skip forwarding gossip messages to peers if their buffer is over-full
1 parent 38732ab commit a6fcb74

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,13 @@ enum InitSyncTracker{
234234
NodesSyncing(PublicKey),
235235
}
236236

237+
/// When the outbound buffer has this many messages, we'll stop reading bytes from the peer until
238+
/// we manage to send messages until we reach this limit.
239+
const OUTBOUND_BUFFER_LIMIT_READ_PAUSE: usize = 10;
240+
/// When the outbound buffer has this many messages, we'll simply skip relaying gossip messages to
241+
/// the peer.
242+
const OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP: usize = 20;
243+
237244
struct Peer {
238245
channel_encryptor: PeerChannelEncryptor,
239246
their_node_id: Option<PublicKey>,
@@ -532,13 +539,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
532539
}
533540
}
534541
}
535-
const MSG_BUFF_SIZE: usize = 10;
536542
while !peer.awaiting_write_event {
537-
if peer.pending_outbound_buffer.len() < MSG_BUFF_SIZE {
543+
if peer.pending_outbound_buffer.len() < OUTBOUND_BUFFER_LIMIT_READ_PAUSE {
538544
match peer.sync_status {
539545
InitSyncTracker::NoSyncRequested => {},
540546
InitSyncTracker::ChannelsSyncing(c) if c < 0xffff_ffff_ffff_ffff => {
541-
let steps = ((MSG_BUFF_SIZE - peer.pending_outbound_buffer.len() + 2) / 3) as u8;
547+
let steps = ((OUTBOUND_BUFFER_LIMIT_READ_PAUSE - peer.pending_outbound_buffer.len() + 2) / 3) as u8;
542548
let all_messages = self.message_handler.route_handler.get_next_channel_announcements(c, steps);
543549
for &(ref announce, ref update_a_option, ref update_b_option) in all_messages.iter() {
544550
encode_and_send_msg!(announce);
@@ -555,7 +561,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
555561
}
556562
},
557563
InitSyncTracker::ChannelsSyncing(c) if c == 0xffff_ffff_ffff_ffff => {
558-
let steps = (MSG_BUFF_SIZE - peer.pending_outbound_buffer.len()) as u8;
564+
let steps = (OUTBOUND_BUFFER_LIMIT_READ_PAUSE - peer.pending_outbound_buffer.len()) as u8;
559565
let all_messages = self.message_handler.route_handler.get_next_node_announcements(None, steps);
560566
for msg in all_messages.iter() {
561567
encode_and_send_msg!(msg);
@@ -567,7 +573,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
567573
},
568574
InitSyncTracker::ChannelsSyncing(_) => unreachable!(),
569575
InitSyncTracker::NodesSyncing(key) => {
570-
let steps = (MSG_BUFF_SIZE - peer.pending_outbound_buffer.len()) as u8;
576+
let steps = (OUTBOUND_BUFFER_LIMIT_READ_PAUSE - peer.pending_outbound_buffer.len()) as u8;
571577
let all_messages = self.message_handler.route_handler.get_next_node_announcements(Some(&key), steps);
572578
for msg in all_messages.iter() {
573579
encode_and_send_msg!(msg);
@@ -586,7 +592,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
586592
Some(buff) => buff,
587593
};
588594

589-
let should_be_reading = peer.pending_outbound_buffer.len() < MSG_BUFF_SIZE;
595+
let should_be_reading = peer.pending_outbound_buffer.len() < OUTBOUND_BUFFER_LIMIT_READ_PAUSE;
590596
let pending = &next_buff[peer.pending_outbound_buffer_first_msg_offset..];
591597
let data_sent = descriptor.send_data(pending, should_be_reading);
592598
peer.pending_outbound_buffer_first_msg_offset += data_sent;
@@ -815,7 +821,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
815821
}
816822
}
817823

818-
peer.pending_outbound_buffer.len() > 10 // pause_read
824+
peer.pending_outbound_buffer.len() > OUTBOUND_BUFFER_LIMIT_READ_PAUSE // pause_read
819825
}
820826
};
821827

@@ -1028,6 +1034,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
10281034
!peer.should_forward_channel_announcement(msg.contents.short_channel_id) {
10291035
continue
10301036
}
1037+
if peer.pending_outbound_buffer.len() > OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP {
1038+
continue;
1039+
}
10311040
if peer.their_node_id.as_ref() == Some(&msg.contents.node_id_1) ||
10321041
peer.their_node_id.as_ref() == Some(&msg.contents.node_id_2) {
10331042
continue;
@@ -1047,6 +1056,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
10471056
!peer.should_forward_node_announcement(msg.contents.node_id) {
10481057
continue
10491058
}
1059+
if peer.pending_outbound_buffer.len() > OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP {
1060+
continue;
1061+
}
10501062
if peer.their_node_id.as_ref() == Some(&msg.contents.node_id) {
10511063
continue;
10521064
}
@@ -1065,6 +1077,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
10651077
!peer.should_forward_channel_announcement(msg.contents.short_channel_id) {
10661078
continue
10671079
}
1080+
if peer.pending_outbound_buffer.len() > OUTBOUND_BUFFER_LIMIT_DROP_GOSSIP {
1081+
continue;
1082+
}
10681083
if except_node.is_some() && peer.their_node_id.as_ref() == except_node {
10691084
continue;
10701085
}

0 commit comments

Comments
 (0)