Skip to content

Commit 9f875f4

Browse files
committed
Indicate outstanding writes to peers directly
Using the peers_needing_send HashSet to determine which peers have any outstanding writes adds complexity without much benefit. Instead, add a needing_send field to the Peer struct to accomplish the same thing.
1 parent f70058e commit 9f875f4

File tree

1 file changed

+14
-18
lines changed

1 file changed

+14
-18
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use util::byte_utils;
1818
use util::events::{MessageSendEvent, MessageSendEventsProvider};
1919
use util::logger::Logger;
2020

21-
use std::collections::{HashMap,hash_map,HashSet,LinkedList};
21+
use std::collections::{HashMap,hash_map,LinkedList};
2222
use std::sync::{Arc, Mutex};
2323
use std::sync::atomic::{AtomicUsize, Ordering};
2424
use std::{cmp,error,hash,fmt};
@@ -120,6 +120,10 @@ struct Peer {
120120
sync_status: InitSyncTracker,
121121

122122
awaiting_pong: bool,
123+
124+
/// Indicates do_read_event() pushed a message into pending_outbound_buffer but didn't call
125+
/// do_attempt_write_data() to avoid reentrancy. Cleared in process_events().
126+
needing_send: bool,
123127
}
124128

125129
impl Peer {
@@ -140,9 +144,6 @@ impl Peer {
140144

141145
struct PeerHolder<Descriptor: SocketDescriptor> {
142146
peers: HashMap<Descriptor, Peer>,
143-
/// Added to by do_read_event for cases where we pushed a message onto the send buffer but
144-
/// didn't call do_attempt_write_data to avoid reentrancy. Cleared in process_events()
145-
peers_needing_send: HashSet<Descriptor>,
146147
/// Only add to this set when noise completes:
147148
node_id_to_descriptor: HashMap<PublicKey, Descriptor>,
148149
}
@@ -228,7 +229,6 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
228229
message_handler: message_handler,
229230
peers: Mutex::new(PeerHolder {
230231
peers: HashMap::new(),
231-
peers_needing_send: HashSet::new(),
232232
node_id_to_descriptor: HashMap::new()
233233
}),
234234
our_node_secret: our_node_secret,
@@ -299,6 +299,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
299299
sync_status: InitSyncTracker::NoSyncRequested,
300300

301301
awaiting_pong: false,
302+
needing_send: false,
302303
}).is_some() {
303304
panic!("PeerManager driver duplicated descriptors!");
304305
};
@@ -336,6 +337,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
336337
sync_status: InitSyncTracker::NoSyncRequested,
337338

338339
awaiting_pong: false,
340+
needing_send: false,
339341
}).is_some() {
340342
panic!("PeerManager driver duplicated descriptors!");
341343
};
@@ -485,7 +487,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
485487
{
486488
log_trace!(self, "Encoding and sending message of type {} to {}", $msg_code, log_pubkey!(peer.their_node_id.unwrap()));
487489
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!($msg, $msg_code)[..]));
488-
peers.peers_needing_send.insert(peer_descriptor.clone());
490+
peer.needing_send = true;
489491
}
490492
}
491493
}
@@ -644,7 +646,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
644646

645647
if msg.features.initial_routing_sync() {
646648
peer.sync_status = InitSyncTracker::ChannelsSyncing(0);
647-
peers.peers_needing_send.insert(peer_descriptor.clone());
649+
peer.needing_send = true;
648650
}
649651

650652
if !peer.outbound {
@@ -1029,7 +1031,6 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
10291031
match *action {
10301032
msgs::ErrorAction::DisconnectPeer { ref msg } => {
10311033
if let Some(mut descriptor) = peers.node_id_to_descriptor.remove(node_id) {
1032-
peers.peers_needing_send.remove(&descriptor);
10331034
if let Some(mut peer) = peers.peers.remove(&descriptor) {
10341035
if let Some(ref msg) = *msg {
10351036
log_trace!(self, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}",
@@ -1063,11 +1064,10 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
10631064
}
10641065
}
10651066

1066-
for mut descriptor in peers.peers_needing_send.drain() {
1067-
match peers.peers.get_mut(&descriptor) {
1068-
Some(peer) => self.do_attempt_write_data(&mut descriptor, peer),
1069-
None => panic!("Inconsistent peers set state!"),
1070-
}
1067+
let peers_needing_send = peers.peers.iter_mut().filter(|(_, peer)| peer.needing_send);
1068+
for (descriptor, peer) in peers_needing_send {
1069+
peer.needing_send = false;
1070+
self.do_attempt_write_data(&mut descriptor.clone(), peer)
10711071
}
10721072
}
10731073
}
@@ -1084,9 +1084,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
10841084

10851085
fn disconnect_event_internal(&self, descriptor: &Descriptor, no_connection_possible: bool) {
10861086
let mut peers = self.peers.lock().unwrap();
1087-
peers.peers_needing_send.remove(descriptor);
1088-
let peer_option = peers.peers.remove(descriptor);
1089-
match peer_option {
1087+
match peers.peers.remove(descriptor) {
10901088
None => panic!("Descriptor for disconnect_event is not already known to PeerManager"),
10911089
Some(peer) => {
10921090
match peer.their_node_id {
@@ -1108,13 +1106,11 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
11081106
let mut peers_lock = self.peers.lock().unwrap();
11091107
{
11101108
let peers = &mut *peers_lock;
1111-
let peers_needing_send = &mut peers.peers_needing_send;
11121109
let node_id_to_descriptor = &mut peers.node_id_to_descriptor;
11131110
let peers = &mut peers.peers;
11141111

11151112
peers.retain(|descriptor, peer| {
11161113
if peer.awaiting_pong == true {
1117-
peers_needing_send.remove(descriptor);
11181114
match peer.their_node_id {
11191115
Some(node_id) => {
11201116
node_id_to_descriptor.remove(&node_id);

0 commit comments

Comments
 (0)