@@ -3420,38 +3420,6 @@ where
3420
3420
true
3421
3421
}
3422
3422
3423
- /// When a peer disconnects but still has channels, the peer's `peer_state` entry in the
3424
- /// `per_peer_state` is not removed by the `peer_disconnected` function. If the channels of
3425
- /// to that peer is later closed while still being disconnected (i.e. force closed), we
3426
- /// therefore need to remove the peer from `peer_state` separately.
3427
- /// To avoid having to take the `per_peer_state` `write` lock once the channels are closed, we
3428
- /// instead remove such peers awaiting removal through this function, which is called on a
3429
- /// timer through `timer_tick_occurred`, passing the peers disconnected peers with no channels,
3430
- /// to limit the negative effects on parallelism as much as possible.
3431
- ///
3432
- /// Must be called without the `per_peer_state` lock acquired.
3433
- fn remove_peers_awaiting_removal ( & self , pending_peers_awaiting_removal : HashSet < PublicKey > ) {
3434
- if pending_peers_awaiting_removal. len ( ) > 0 {
3435
- let mut per_peer_state = self . per_peer_state . write ( ) . unwrap ( ) ;
3436
- for counterparty_node_id in pending_peers_awaiting_removal {
3437
- match per_peer_state. entry ( counterparty_node_id) {
3438
- hash_map:: Entry :: Occupied ( entry) => {
3439
- // Remove the entry if the peer is still disconnected and we still
3440
- // have no channels to the peer.
3441
- let remove_entry = {
3442
- let peer_state = entry. get ( ) . lock ( ) . unwrap ( ) ;
3443
- !peer_state. is_connected && peer_state. channel_by_id . len ( ) == 0
3444
- } ;
3445
- if remove_entry {
3446
- entry. remove_entry ( ) ;
3447
- }
3448
- } ,
3449
- hash_map:: Entry :: Vacant ( _) => { /* The PeerState has already been removed */ }
3450
- }
3451
- }
3452
- }
3453
- }
3454
-
3455
3423
#[ cfg( any( test, feature = "_test_utils" ) ) ]
3456
3424
/// Process background events, for functional testing
3457
3425
pub fn test_process_background_events ( & self ) {
@@ -3525,7 +3493,7 @@ where
3525
3493
3526
3494
let mut handle_errors: Vec < ( Result < ( ) , _ > , _ ) > = Vec :: new ( ) ;
3527
3495
let mut timed_out_mpp_htlcs = Vec :: new ( ) ;
3528
- let mut pending_peers_awaiting_removal = HashSet :: new ( ) ;
3496
+ let mut pending_peers_awaiting_removal = Vec :: new ( ) ;
3529
3497
{
3530
3498
let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
3531
3499
for ( counterparty_node_id, peer_state_mutex) in per_peer_state. iter ( ) {
@@ -3575,11 +3543,37 @@ where
3575
3543
} ) ;
3576
3544
let peer_should_be_removed = !peer_state. is_connected && peer_state. channel_by_id . len ( ) == 0 ;
3577
3545
if peer_should_be_removed {
3578
- pending_peers_awaiting_removal. insert ( counterparty_node_id) ;
3546
+ pending_peers_awaiting_removal. push ( counterparty_node_id) ;
3547
+ }
3548
+ }
3549
+ }
3550
+
3551
+ // When a peer disconnects but still has channels, the peer's `peer_state` entry in the
3552
+ // `per_peer_state` is not removed by the `peer_disconnected` function. If the channels
3553
+ // of to that peer is later closed while still being disconnected (i.e. force closed),
3554
+ // we therefore need to remove the peer from `peer_state` separately.
3555
+ // To avoid having to take the `per_peer_state` `write` lock once the channels are
3556
+ // closed, we instead remove such peers awaiting removal here on a timer, to limit the
3557
+ // negative effects on parallelism as much as possible.
3558
+ if pending_peers_awaiting_removal. len ( ) > 0 {
3559
+ let mut per_peer_state = self . per_peer_state . write ( ) . unwrap ( ) ;
3560
+ for counterparty_node_id in pending_peers_awaiting_removal {
3561
+ match per_peer_state. entry ( counterparty_node_id) {
3562
+ hash_map:: Entry :: Occupied ( entry) => {
3563
+ // Remove the entry if the peer is still disconnected and we still
3564
+ // have no channels to the peer.
3565
+ let remove_entry = {
3566
+ let peer_state = entry. get ( ) . lock ( ) . unwrap ( ) ;
3567
+ !peer_state. is_connected && peer_state. channel_by_id . len ( ) == 0
3568
+ } ;
3569
+ if remove_entry {
3570
+ entry. remove_entry ( ) ;
3571
+ }
3572
+ } ,
3573
+ hash_map:: Entry :: Vacant ( _) => { /* The PeerState has already been removed */ }
3579
3574
}
3580
3575
}
3581
3576
}
3582
- self . remove_peers_awaiting_removal ( pending_peers_awaiting_removal) ;
3583
3577
3584
3578
self . claimable_payments . lock ( ) . unwrap ( ) . claimable_htlcs . retain ( |payment_hash, ( _, htlcs) | {
3585
3579
if htlcs. is_empty ( ) {
0 commit comments