Skip to content

Commit 5251618

Browse files
fixup! Limit OnionMessenger outbound buffer size
1 parent 28060cf commit 5251618

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

lightning/src/onion_message/functional_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,5 +178,5 @@ fn peer_buffer_full() {
178178
nodes[0].messenger.send_onion_message(&[], Destination::Node(nodes[1].get_node_pk()), None).unwrap();
179179
}
180180
let err = nodes[0].messenger.send_onion_message(&[], Destination::Node(nodes[1].get_node_pk()), None).unwrap_err();
181-
assert_eq!(err, SendError::PeerBufferFull);
181+
assert_eq!(err, SendError::BufferFull);
182182
}

lightning/src/onion_message/messenger.rs

+25-10
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ pub enum SendError {
123123
TooFewBlindedHops,
124124
/// Our next-hop peer was offline or does not support onion message forwarding.
125125
InvalidFirstHop,
126-
/// Our next-hop peer's buffer was full.
127-
PeerBufferFull,
126+
/// Our next-hop peer's buffer was full or our total outbound buffer was full.
127+
BufferFull,
128128
}
129129

130130
impl<Signer: Sign, K: Deref, L: Deref> OnionMessenger<Signer, K, L>
@@ -172,10 +172,10 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessenger<Signer, K, L>
172172
packet_payloads, packet_keys, prng_seed).map_err(|()| SendError::TooBigPacket)?;
173173

174174
let mut pending_per_peer_msgs = self.pending_messages.lock().unwrap();
175+
if outbound_buffer_full(&introduction_node_id, &pending_per_peer_msgs) { return Err(SendError::BufferFull) }
175176
match pending_per_peer_msgs.entry(introduction_node_id) {
176177
hash_map::Entry::Vacant(_) => Err(SendError::InvalidFirstHop),
177178
hash_map::Entry::Occupied(mut e) => {
178-
if peer_buffer_full(e.get()) { return Err(SendError::PeerBufferFull) }
179179
e.get_mut().push_back(msgs::OnionMessage { blinding_point, onion_routing_packet });
180180
Ok(())
181181
}
@@ -196,13 +196,24 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessenger<Signer, K, L>
196196
}
197197
}
198198

199-
fn peer_buffer_full(peer_buf: &VecDeque<msgs::OnionMessage>) -> bool {
200-
const MAX_BUFFER_SIZE: usize = 1024 * 256;
201-
let mut buffered_bytes = 0;
202-
for om in peer_buf {
203-
buffered_bytes += om.serialized_length();
204-
if buffered_bytes >= MAX_BUFFER_SIZE {
205-
return true
199+
fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, VecDeque<msgs::OnionMessage>>) -> bool {
200+
const MAX_TOTAL_BUFFER_SIZE: usize = (2 << 20) * 128;
201+
const MAX_PER_PEER_BUFFER_SIZE: usize = (2 << 10) * 256;
202+
let mut total_buffered_bytes = 0;
203+
let mut peer_buffered_bytes = 0;
204+
for (pk, peer_buf) in buffer {
205+
for om in peer_buf {
206+
let om_len = om.serialized_length();
207+
if pk == peer_node_id {
208+
peer_buffered_bytes += om_len;
209+
}
210+
total_buffered_bytes += om_len;
211+
212+
if total_buffered_bytes >= MAX_TOTAL_BUFFER_SIZE ||
213+
peer_buffered_bytes >= MAX_PER_PEER_BUFFER_SIZE
214+
{
215+
return true
216+
}
206217
}
207218
}
208219
false
@@ -294,6 +305,10 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessageHandler for OnionMessenger<Si
294305
};
295306

296307
let mut pending_per_peer_msgs = self.pending_messages.lock().unwrap();
308+
if outbound_buffer_full(&next_node_id, &pending_per_peer_msgs) {
309+
log_trace!(self.logger, "Dropping forwarded onion message to peer {:?}: outbound buffer full", next_node_id);
310+
return
311+
}
297312

298313
#[cfg(fuzzing)]
299314
pending_per_peer_msgs.entry(next_node_id).or_insert_with(|| VecDeque::new());

0 commit comments

Comments
 (0)