@@ -493,6 +493,18 @@ pub(super) struct PeerState<Signer: ChannelSigner> {
493
493
is_connected : bool ,
494
494
}
495
495
496
+ impl < Signer : ChannelSigner > PeerState < Signer > {
497
+ /// Indicates that a peer meets the criteria where we're ok to remove it from our storage.
498
+ /// If true is passed for `require_disconnected`, the function will return false if we haven't
499
+ /// disconnected from the node already, ie. `PeerState::is_connected` is set to `true`.
500
+ fn ok_to_remove ( & self , require_disconnected : bool ) -> bool {
501
+ if require_disconnected && self . is_connected {
502
+ return false
503
+ }
504
+ self . channel_by_id . len ( ) == 0
505
+ }
506
+ }
507
+
496
508
/// Stores a PaymentSecret and any other data we may need to validate an inbound payment is
497
509
/// actually ours and not some duplicate HTLC sent to us by a node along the route.
498
510
///
@@ -3521,8 +3533,7 @@ where
3521
3533
3522
3534
true
3523
3535
} ) ;
3524
- let peer_should_be_removed = !peer_state. is_connected && peer_state. channel_by_id . len ( ) == 0 ;
3525
- if peer_should_be_removed {
3536
+ if peer_state. ok_to_remove ( true ) {
3526
3537
pending_peers_awaiting_removal. push ( counterparty_node_id) ;
3527
3538
}
3528
3539
}
@@ -3544,7 +3555,7 @@ where
3544
3555
// have no channels to the peer.
3545
3556
let remove_entry = {
3546
3557
let peer_state = entry. get ( ) . lock ( ) . unwrap ( ) ;
3547
- ! peer_state. is_connected && peer_state . channel_by_id . len ( ) == 0
3558
+ peer_state. ok_to_remove ( true )
3548
3559
} ;
3549
3560
if remove_entry {
3550
3561
entry. remove_entry ( ) ;
@@ -6254,9 +6265,8 @@ where
6254
6265
fn peer_disconnected ( & self , counterparty_node_id : & PublicKey , no_connection_possible : bool ) {
6255
6266
let _persistence_guard = PersistenceNotifierGuard :: notify_on_drop ( & self . total_consistency_lock , & self . persistence_notifier ) ;
6256
6267
let mut failed_channels = Vec :: new ( ) ;
6257
- let mut no_channels_remain = true ;
6258
6268
let mut per_peer_state = self . per_peer_state . write ( ) . unwrap ( ) ;
6259
- {
6269
+ let remove_peer = {
6260
6270
log_debug ! ( self . logger, "Marking channels with {} disconnected and generating channel_updates. We believe we {} make future connections to this peer." ,
6261
6271
log_pubkey!( counterparty_node_id) , if no_connection_possible { "cannot" } else { "can" } ) ;
6262
6272
if let Some ( peer_state_mutex) = per_peer_state. get ( counterparty_node_id) {
@@ -6269,8 +6279,6 @@ where
6269
6279
update_maps_on_chan_removal ! ( self , chan) ;
6270
6280
self . issue_channel_close_events ( chan, ClosureReason :: DisconnectedPeer ) ;
6271
6281
return false ;
6272
- } else {
6273
- no_channels_remain = false ;
6274
6282
}
6275
6283
true
6276
6284
} ) ;
@@ -6300,9 +6308,10 @@ where
6300
6308
} ) ;
6301
6309
debug_assert ! ( peer_state. is_connected, "A disconnected peer cannot disconnect" ) ;
6302
6310
peer_state. is_connected = false ;
6303
- }
6304
- }
6305
- if no_channels_remain {
6311
+ peer_state. ok_to_remove ( true )
6312
+ } else { true }
6313
+ } ;
6314
+ if remove_peer {
6306
6315
per_peer_state. remove ( counterparty_node_id) ;
6307
6316
}
6308
6317
mem:: drop ( per_peer_state) ;
@@ -6896,13 +6905,17 @@ where
6896
6905
best_block. block_hash ( ) . write ( writer) ?;
6897
6906
}
6898
6907
6908
+ let mut serializable_peer_count: u64 = 0 ;
6899
6909
{
6900
6910
let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
6901
6911
let mut unfunded_channels = 0 ;
6902
6912
let mut number_of_channels = 0 ;
6903
6913
for ( _, peer_state_mutex) in per_peer_state. iter ( ) {
6904
6914
let mut peer_state_lock = peer_state_mutex. lock ( ) . unwrap ( ) ;
6905
6915
let peer_state = & mut * peer_state_lock;
6916
+ if !peer_state. ok_to_remove ( false ) {
6917
+ serializable_peer_count += 1 ;
6918
+ }
6906
6919
number_of_channels += peer_state. channel_by_id . len ( ) ;
6907
6920
for ( _, channel) in peer_state. channel_by_id . iter ( ) {
6908
6921
if !channel. is_funding_initiated ( ) {
@@ -6953,11 +6966,18 @@ where
6953
6966
htlc_purposes. push ( purpose) ;
6954
6967
}
6955
6968
6956
- ( per_peer_state . len ( ) as u64 ) . write ( writer) ?;
6969
+ ( serializable_peer_count ) . write ( writer) ?;
6957
6970
for ( peer_pubkey, peer_state_mutex) in per_peer_state. iter ( ) {
6958
- peer_pubkey. write ( writer) ?;
6959
- let peer_state = peer_state_mutex. lock ( ) . unwrap ( ) ;
6960
- peer_state. latest_features . write ( writer) ?;
6971
+ let peer_state_lock = peer_state_mutex. lock ( ) . unwrap ( ) ;
6972
+ let peer_state = & * peer_state_lock;
6973
+ // Peers which we have no channels to should be dropped once disconnected. As we
6974
+ // disconnect all peers when shutting down and serializing the ChannelManager, we
6975
+ // consider all peers as disconnected here. There's therefore no need write peers with
6976
+ // no channels.
6977
+ if !peer_state. ok_to_remove ( false ) {
6978
+ peer_pubkey. write ( writer) ?;
6979
+ peer_state. latest_features . write ( writer) ?;
6980
+ }
6961
6981
}
6962
6982
6963
6983
let events = self . pending_events . lock ( ) . unwrap ( ) ;
0 commit comments