Skip to content

Commit eb24218

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 9c572a9 commit eb24218

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
@@ -16,7 +16,7 @@ use util::byte_utils;
1616
use util::events::{MessageSendEvent};
1717
use util::logger::Logger;
1818

19-
use std::collections::{HashMap,hash_map,HashSet,LinkedList};
19+
use std::collections::{HashMap,hash_map,LinkedList};
2020
use std::sync::{Arc, Mutex};
2121
use std::sync::atomic::{AtomicUsize, Ordering};
2222
use std::{cmp,error,hash,fmt};
@@ -117,6 +117,10 @@ struct Peer {
117117
sync_status: InitSyncTracker,
118118

119119
awaiting_pong: bool,
120+
121+
/// Indicates do_read_event() pushed a message into pending_outbound_buffer but didn't call
122+
/// do_attempt_write_data() to avoid reentrancy. Cleared in process_events().
123+
needing_send: bool,
120124
}
121125

122126
impl Peer {
@@ -137,9 +141,6 @@ impl Peer {
137141

138142
struct PeerHolder<Descriptor: SocketDescriptor> {
139143
peers: HashMap<Descriptor, Peer>,
140-
/// Added to by do_read_event for cases where we pushed a message onto the send buffer but
141-
/// didn't call do_attempt_write_data to avoid reentrancy. Cleared in process_events()
142-
peers_needing_send: HashSet<Descriptor>,
143144
/// Only add to this set when noise completes:
144145
node_id_to_descriptor: HashMap<PublicKey, Descriptor>,
145146
}
@@ -204,7 +205,6 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
204205
message_handler: message_handler,
205206
peers: Mutex::new(PeerHolder {
206207
peers: HashMap::new(),
207-
peers_needing_send: HashSet::new(),
208208
node_id_to_descriptor: HashMap::new()
209209
}),
210210
our_node_secret: our_node_secret,
@@ -275,6 +275,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
275275
sync_status: InitSyncTracker::NoSyncRequested,
276276

277277
awaiting_pong: false,
278+
needing_send: false,
278279
}).is_some() {
279280
panic!("PeerManager driver duplicated descriptors!");
280281
};
@@ -312,6 +313,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
312313
sync_status: InitSyncTracker::NoSyncRequested,
313314

314315
awaiting_pong: false,
316+
needing_send: false,
315317
}).is_some() {
316318
panic!("PeerManager driver duplicated descriptors!");
317319
};
@@ -461,7 +463,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
461463
{
462464
log_trace!(self, "Encoding and sending message of type {} to {}", $msg_code, log_pubkey!(peer.their_node_id.unwrap()));
463465
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!($msg, $msg_code)[..]));
464-
peers.peers_needing_send.insert(peer_descriptor.clone());
466+
peer.needing_send = true;
465467
}
466468
}
467469
}
@@ -620,7 +622,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
620622

621623
if msg.features.initial_routing_sync() {
622624
peer.sync_status = InitSyncTracker::ChannelsSyncing(0);
623-
peers.peers_needing_send.insert(peer_descriptor.clone());
625+
peer.needing_send = true;
624626
}
625627
peer.their_features = Some(msg.features);
626628

@@ -1005,7 +1007,6 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
10051007
match *action {
10061008
msgs::ErrorAction::DisconnectPeer { ref msg } => {
10071009
if let Some(mut descriptor) = peers.node_id_to_descriptor.remove(node_id) {
1008-
peers.peers_needing_send.remove(&descriptor);
10091010
if let Some(mut peer) = peers.peers.remove(&descriptor) {
10101011
if let Some(ref msg) = *msg {
10111012
log_trace!(self, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}",
@@ -1039,11 +1040,10 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
10391040
}
10401041
}
10411042

1042-
for mut descriptor in peers.peers_needing_send.drain() {
1043-
match peers.peers.get_mut(&descriptor) {
1044-
Some(peer) => self.do_attempt_write_data(&mut descriptor, peer),
1045-
None => panic!("Inconsistent peers set state!"),
1046-
}
1043+
let peers_needing_send = peers.peers.iter_mut().filter(|(_, peer)| peer.needing_send);
1044+
for (descriptor, peer) in peers_needing_send {
1045+
peer.needing_send = false;
1046+
self.do_attempt_write_data(&mut descriptor.clone(), peer)
10471047
}
10481048
}
10491049
}
@@ -1060,9 +1060,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
10601060

10611061
fn disconnect_event_internal(&self, descriptor: &Descriptor, no_connection_possible: bool) {
10621062
let mut peers = self.peers.lock().unwrap();
1063-
peers.peers_needing_send.remove(descriptor);
1064-
let peer_option = peers.peers.remove(descriptor);
1065-
match peer_option {
1063+
match peers.peers.remove(descriptor) {
10661064
None => panic!("Descriptor for disconnect_event is not already known to PeerManager"),
10671065
Some(peer) => {
10681066
match peer.their_node_id {
@@ -1084,13 +1082,11 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
10841082
let mut peers_lock = self.peers.lock().unwrap();
10851083
{
10861084
let peers = &mut *peers_lock;
1087-
let peers_needing_send = &mut peers.peers_needing_send;
10881085
let node_id_to_descriptor = &mut peers.node_id_to_descriptor;
10891086
let peers = &mut peers.peers;
10901087

10911088
peers.retain(|descriptor, peer| {
10921089
if peer.awaiting_pong == true {
1093-
peers_needing_send.remove(descriptor);
10941090
match peer.their_node_id {
10951091
Some(node_id) => {
10961092
node_id_to_descriptor.remove(&node_id);

0 commit comments

Comments
 (0)