Skip to content

Commit 1b08cf4

Browse files
committed
Reliably deliver gossip messages from our ChannelMessageHandler
When our `ChannelMessageHandler` creates gossip broadcast `MessageSendEvent`s, we generally want these to be reliably delivered to all our peers, even if there's not much buffer space available. Here we do this by passing an extra flag to `forward_broadcast_msg` which indicates where the message came from, then ignoring the buffer-full criteria when the flag is set.
1 parent 572e760 commit 1b08cf4

File tree

1 file changed

+31
-14
lines changed

1 file changed

+31
-14
lines changed

lightning/src/ln/peer_handler.rs

+31-14
Original file line numberDiff line numberDiff line change
@@ -1605,7 +1605,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
16051605
}
16061606

16071607
for msg in msgs_to_forward.drain(..) {
1608-
self.forward_broadcast_msg(&*peers, &msg, peer_node_id.as_ref().map(|(pk, _)| pk));
1608+
self.forward_broadcast_msg(&*peers, &msg, peer_node_id.as_ref().map(|(pk, _)| pk), false);
16091609
}
16101610

16111611
Ok(pause_read)
@@ -1948,7 +1948,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
19481948
Ok(should_forward)
19491949
}
19501950

1951-
fn forward_broadcast_msg(&self, peers: &HashMap<Descriptor, Mutex<Peer>>, msg: &wire::Message<<<CMH as Deref>::Target as wire::CustomMessageReader>::CustomMessage>, except_node: Option<&PublicKey>) {
1951+
/// Forwards a gossip `msg` to `peers` excluding node(s) that generated the gossip message and
1952+
/// excluding `except_node`.
1953+
///
1954+
/// If the message queue for a peer is somewhat full, the message will not be forwarded to them
1955+
/// unless `allow_large_buffer` is set, in which case the message will be treated as critical
1956+
/// and delivered no matter the available buffer space.
1957+
fn forward_broadcast_msg(&self, peers: &HashMap<Descriptor, Mutex<Peer>>, msg: &wire::Message<<<CMH as Deref>::Target as wire::CustomMessageReader>::CustomMessage>, except_node: Option<&PublicKey>, allow_large_buffer: bool) {
19521958
match msg {
19531959
wire::Message::ChannelAnnouncement(ref msg) => {
19541960
log_gossip!(self.logger, "Sending message to all peers except {:?} or the announced channel's counterparties: {:?}", except_node, msg);
@@ -1963,7 +1969,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
19631969
debug_assert!(peer.their_node_id.is_some());
19641970
debug_assert!(peer.channel_encryptor.is_ready_for_encryption());
19651971
let logger = WithContext::from(&self.logger, peer.their_node_id.map(|p| p.0), None, None);
1966-
if peer.buffer_full_drop_gossip_broadcast() {
1972+
if peer.buffer_full_drop_gossip_broadcast() && !allow_large_buffer {
19671973
log_gossip!(logger, "Skipping broadcast message to {:?} as its outbound buffer is full", peer.their_node_id);
19681974
continue;
19691975
}
@@ -1991,7 +1997,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
19911997
debug_assert!(peer.their_node_id.is_some());
19921998
debug_assert!(peer.channel_encryptor.is_ready_for_encryption());
19931999
let logger = WithContext::from(&self.logger, peer.their_node_id.map(|p| p.0), None, None);
1994-
if peer.buffer_full_drop_gossip_broadcast() {
2000+
if peer.buffer_full_drop_gossip_broadcast() && !allow_large_buffer {
19952001
log_gossip!(logger, "Skipping broadcast message to {:?} as its outbound buffer is full", peer.their_node_id);
19962002
continue;
19972003
}
@@ -2019,7 +2025,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
20192025
debug_assert!(peer.their_node_id.is_some());
20202026
debug_assert!(peer.channel_encryptor.is_ready_for_encryption());
20212027
let logger = WithContext::from(&self.logger, peer.their_node_id.map(|p| p.0), None, None);
2022-
if peer.buffer_full_drop_gossip_broadcast() {
2028+
if peer.buffer_full_drop_gossip_broadcast() && !allow_large_buffer {
20232029
log_gossip!(logger, "Skipping broadcast message to {:?} as its outbound buffer is full", peer.their_node_id);
20242030
continue;
20252031
}
@@ -2101,6 +2107,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
21012107
}
21022108
}
21032109
}
2110+
2111+
// Handles a `MessageSendEvent`, using `from_chan_handler` to decide if we should
2112+
// robustly gossip broadcast events even if a peer's message buffer is full.
21042113
let mut handle_event = |event, from_chan_handler| {
21052114
match event {
21062115
MessageSendEvent::SendAcceptChannel { ref node_id, ref msg } => {
@@ -2295,31 +2304,39 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
22952304
MessageSendEvent::BroadcastChannelAnnouncement { msg, update_msg } => {
22962305
log_debug!(self.logger, "Handling BroadcastChannelAnnouncement event in peer_handler for short channel id {}", msg.contents.short_channel_id);
22972306
match self.message_handler.route_handler.handle_channel_announcement(&msg) {
2298-
Ok(_) | Err(LightningError { action: msgs::ErrorAction::IgnoreDuplicateGossip, .. }) =>
2299-
self.forward_broadcast_msg(peers, &wire::Message::ChannelAnnouncement(msg), None),
2307+
Ok(_) | Err(LightningError { action: msgs::ErrorAction::IgnoreDuplicateGossip, .. }) => {
2308+
let forward = wire::Message::ChannelAnnouncement(msg);
2309+
self.forward_broadcast_msg(peers, &forward, None, from_chan_handler);
2310+
},
23002311
_ => {},
23012312
}
23022313
if let Some(msg) = update_msg {
23032314
match self.message_handler.route_handler.handle_channel_update(&msg) {
2304-
Ok(_) | Err(LightningError { action: msgs::ErrorAction::IgnoreDuplicateGossip, .. }) =>
2305-
self.forward_broadcast_msg(peers, &wire::Message::ChannelUpdate(msg), None),
2315+
Ok(_) | Err(LightningError { action: msgs::ErrorAction::IgnoreDuplicateGossip, .. }) => {
2316+
let forward = wire::Message::ChannelUpdate(msg);
2317+
self.forward_broadcast_msg(peers, &forward, None, from_chan_handler);
2318+
},
23062319
_ => {},
23072320
}
23082321
}
23092322
},
23102323
MessageSendEvent::BroadcastChannelUpdate { msg } => {
23112324
log_debug!(self.logger, "Handling BroadcastChannelUpdate event in peer_handler for contents {:?}", msg.contents);
23122325
match self.message_handler.route_handler.handle_channel_update(&msg) {
2313-
Ok(_) | Err(LightningError { action: msgs::ErrorAction::IgnoreDuplicateGossip, .. }) =>
2314-
self.forward_broadcast_msg(peers, &wire::Message::ChannelUpdate(msg), None),
2326+
Ok(_) | Err(LightningError { action: msgs::ErrorAction::IgnoreDuplicateGossip, .. }) => {
2327+
let forward = wire::Message::ChannelUpdate(msg);
2328+
self.forward_broadcast_msg(peers, &forward, None, from_chan_handler);
2329+
},
23152330
_ => {},
23162331
}
23172332
},
23182333
MessageSendEvent::BroadcastNodeAnnouncement { msg } => {
23192334
log_debug!(self.logger, "Handling BroadcastNodeAnnouncement event in peer_handler for node {}", msg.contents.node_id);
23202335
match self.message_handler.route_handler.handle_node_announcement(&msg) {
2321-
Ok(_) | Err(LightningError { action: msgs::ErrorAction::IgnoreDuplicateGossip, .. }) =>
2322-
self.forward_broadcast_msg(peers, &wire::Message::NodeAnnouncement(msg), None),
2336+
Ok(_) | Err(LightningError { action: msgs::ErrorAction::IgnoreDuplicateGossip, .. }) => {
2337+
let forward = wire::Message::NodeAnnouncement(msg);
2338+
self.forward_broadcast_msg(peers, &forward, None, from_chan_handler);
2339+
},
23232340
_ => {},
23242341
}
23252342
},
@@ -2690,7 +2707,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
26902707

26912708
log_debug!(self.logger, "Broadcasting NodeAnnouncement after passing it to our own RoutingMessageHandler.");
26922709
let _ = self.message_handler.route_handler.handle_node_announcement(&msg);
2693-
self.forward_broadcast_msg(&*self.peers.read().unwrap(), &wire::Message::NodeAnnouncement(msg), None);
2710+
self.forward_broadcast_msg(&*self.peers.read().unwrap(), &wire::Message::NodeAnnouncement(msg), None, true);
26942711
}
26952712
}
26962713

0 commit comments

Comments
 (0)