From: Matt Corallo Date: Sun, 1 Mar 2020 03:03:53 +0000 (-0500) Subject: Dont hold peers lock when calling user code X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=dae9990b774553515c7183476218a7fb518fc66c;p=rust-lightning Dont hold peers lock when calling user code --- diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index 81b71affc..aa6954407 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -1135,18 +1135,30 @@ impl PeerManager where /// Will most likely call send_data on all of the registered descriptors, thus, be very careful with reentrancy issues! pub fn timer_tick_occured(&self) { - let mut peers_lock = self.peers.lock().unwrap(); + let mut descriptors_needing_disconnect = Vec::new(); { + let peers_lock = self.peers.lock().unwrap(); + for (descriptor, peer) in peers_lock.peers.iter() { + if peer.awaiting_pong { + descriptors_needing_disconnect.push(descriptor.clone()); + } + } + } + + for mut descriptor in descriptors_needing_disconnect.drain(..) { + descriptor.disconnect_socket(); + } + + { + let mut peers_lock = self.peers.lock().unwrap(); let peers = &mut *peers_lock; let peers_needing_send = &mut peers.peers_needing_send; let node_id_to_descriptor = &mut peers.node_id_to_descriptor; let peers = &mut peers.peers; - let mut descriptors_needing_disconnect = Vec::new(); peers.retain(|descriptor, peer| { if peer.awaiting_pong { peers_needing_send.remove(descriptor); - descriptors_needing_disconnect.push(descriptor.clone()); match peer.their_node_id { Some(node_id) => { log_trace!(self, "Disconnecting peer with id {} due to ping timeout", node_id); @@ -1179,10 +1191,6 @@ impl PeerManager where peer.awaiting_pong = true; true }); - - for mut descriptor in descriptors_needing_disconnect.drain(..) { - descriptor.disconnect_socket(); - } } } }