Skip to content

Commit 69c66f4

Browse files
committed
Avoid the peers write lock unless we need it in peer_handler
1 parent 79f29ad commit 69c66f4

File tree

1 file changed

+22
-21
lines changed

1 file changed

+22
-21
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,32 +1527,20 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
15271527
///
15281528
/// [`send_data`]: SocketDescriptor::send_data
15291529
pub fn timer_tick_occurred(&self) {
1530-
let mut peers_lock = self.peers.write().unwrap();
1530+
let mut descriptors_needing_disconnect = Vec::new();
15311531
{
1532-
let mut descriptors_needing_disconnect = Vec::new();
1532+
let peers_lock = self.peers.read().unwrap();
15331533

1534-
peers_lock.peers.retain(|descriptor, peer_mutex| {
1534+
for (descriptor, peer_mutex) in peers_lock.peers.iter() {
15351535
let mut peer = peer_mutex.lock().unwrap();
15361536
if peer.awaiting_pong {
15371537
descriptors_needing_disconnect.push(descriptor.clone());
1538-
match peer.their_node_id {
1539-
Some(node_id) => {
1540-
log_trace!(self.logger, "Disconnecting peer with id {} due to ping timeout", node_id);
1541-
self.node_id_to_descriptor.lock().unwrap().remove(&node_id);
1542-
self.message_handler.chan_handler.peer_disconnected(&node_id, false);
1543-
}
1544-
None => {
1545-
// This can't actually happen as we should have hit
1546-
// is_ready_for_encryption() previously on this same peer.
1547-
unreachable!();
1548-
},
1549-
}
1550-
return false;
1538+
continue;
15511539
}
15521540

15531541
if !peer.channel_encryptor.is_ready_for_encryption() {
15541542
// The peer needs to complete its handshake before we can exchange messages
1555-
return true;
1543+
continue;
15561544
}
15571545

15581546
let ping = msgs::Ping {
@@ -1561,12 +1549,25 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
15611549
};
15621550
self.enqueue_message(&mut *peer, &ping);
15631551

1564-
let mut descriptor_clone = descriptor.clone();
1565-
self.do_attempt_write_data(&mut descriptor_clone, &mut *peer);
1552+
self.do_attempt_write_data(&mut (descriptor.clone()), &mut *peer);
15661553

15671554
peer.awaiting_pong = true;
1568-
true
1569-
});
1555+
}
1556+
}
1557+
1558+
if !descriptors_needing_disconnect.is_empty() {
1559+
{
1560+
let mut peers_lock = self.peers.write().unwrap();
1561+
for descriptor in descriptors_needing_disconnect.iter() {
1562+
if let Some(peer) = peers_lock.peers.remove(&descriptor) {
1563+
let node_id = peer.lock().unwrap()
1564+
.their_node_id.expect("We only set awaiting_pong after node_id is set and it cannot be unset");
1565+
log_trace!(self.logger, "Disconnecting peer with id {} due to ping timeout", node_id);
1566+
self.node_id_to_descriptor.lock().unwrap().remove(&node_id);
1567+
self.message_handler.chan_handler.peer_disconnected(&node_id, false);
1568+
}
1569+
}
1570+
}
15701571

15711572
for mut descriptor in descriptors_needing_disconnect.drain(..) {
15721573
descriptor.disconnect_socket();

0 commit comments

Comments
 (0)