@@ -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