@@ -293,6 +293,12 @@ impl<ChanSigner: ChannelKeys> ChannelHolder<ChanSigner> {
293
293
}
294
294
}
295
295
296
+ /// State we hold per-peer. In the future we should put channels in here, but for now we only hold
297
+ /// the latest Init features we heard from the peer.
298
+ struct PerPeerState {
299
+ latest_features : Features < FeatureContextInit > ,
300
+ }
301
+
296
302
#[ cfg( not( any( target_pointer_width = "32" , target_pointer_width = "64" ) ) ) ]
297
303
const ERR : ( ) = "You need at least 32 bit pointers (well, usize, but we'll assume they're the same) for ChannelManager::latest_block_height" ;
298
304
@@ -346,6 +352,14 @@ pub struct ChannelManager<ChanSigner: ChannelKeys> {
346
352
channel_state : Mutex < ChannelHolder < ChanSigner > > ,
347
353
our_network_key : SecretKey ,
348
354
355
+ /// Per-peer state storage.
356
+ /// Because adding or removing an entry is rare, we usually take an outer read lock and then
357
+ /// operate on the inner value freely. Sadly, this prevents parallel operation when opening a
358
+ /// new channel.
359
+ /// If we are connected to a peer we always at least have an entry here, to store their features
360
+ /// so that we have them available if we open a channel with them and need it for routing.
361
+ per_peer_state : RwLock < HashMap < PublicKey , Mutex < PerPeerState > > > ,
362
+
349
363
pending_events : Mutex < Vec < events:: Event > > ,
350
364
/// Used when we have to take a BIG lock to make sure everything is self-consistent.
351
365
/// Essentially just when we're serializing ourselves out.
@@ -625,6 +639,8 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
625
639
} ) ,
626
640
our_network_key : keys_manager. get_node_secret ( ) ,
627
641
642
+ per_peer_state : RwLock :: new ( HashMap :: new ( ) ) ,
643
+
628
644
pending_events : Mutex :: new ( Vec :: new ( ) ) ,
629
645
total_consistency_lock : RwLock :: new ( ( ) ) ,
630
646
@@ -2817,6 +2833,7 @@ impl<ChanSigner: ChannelKeys> ChannelMessageHandler for ChannelManager<ChanSigne
2817
2833
let _ = self . total_consistency_lock . read ( ) . unwrap ( ) ;
2818
2834
let mut failed_channels = Vec :: new ( ) ;
2819
2835
let mut failed_payments = Vec :: new ( ) ;
2836
+ let mut no_channels_remain = true ;
2820
2837
{
2821
2838
let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
2822
2839
let channel_state = channel_state_lock. borrow_parts ( ) ;
@@ -2844,6 +2861,7 @@ impl<ChanSigner: ChannelKeys> ChannelMessageHandler for ChannelManager<ChanSigne
2844
2861
log_debug ! ( self , "Marking channels with {} disconnected and generating channel_updates" , log_pubkey!( their_node_id) ) ;
2845
2862
channel_state. by_id . retain ( |_, chan| {
2846
2863
if chan. get_their_node_id ( ) == * their_node_id {
2864
+ no_channels_remain = false ;
2847
2865
let failed_adds = chan. remove_uncommitted_htlcs_and_mark_paused ( ) ;
2848
2866
chan. to_disabled_marked ( ) ;
2849
2867
if !failed_adds. is_empty ( ) {
@@ -2880,6 +2898,10 @@ impl<ChanSigner: ChannelKeys> ChannelMessageHandler for ChannelManager<ChanSigne
2880
2898
}
2881
2899
} ) ;
2882
2900
}
2901
+ if no_channels_remain {
2902
+ self . per_peer_state . write ( ) . unwrap ( ) . remove ( their_node_id) ;
2903
+ }
2904
+
2883
2905
for failure in failed_channels. drain ( ..) {
2884
2906
self . finish_force_close_channel ( failure) ;
2885
2907
}
@@ -2890,10 +2912,25 @@ impl<ChanSigner: ChannelKeys> ChannelMessageHandler for ChannelManager<ChanSigne
2890
2912
}
2891
2913
}
2892
2914
2893
- fn peer_connected ( & self , their_node_id : & PublicKey , _init_msg : & msgs:: Init ) {
2915
+ fn peer_connected ( & self , their_node_id : & PublicKey , init_msg : & msgs:: Init ) {
2894
2916
log_debug ! ( self , "Generating channel_reestablish events for {}" , log_pubkey!( their_node_id) ) ;
2895
2917
2896
2918
let _ = self . total_consistency_lock . read ( ) . unwrap ( ) ;
2919
+
2920
+ {
2921
+ let mut peer_state_lock = self . per_peer_state . write ( ) . unwrap ( ) ;
2922
+ match peer_state_lock. entry ( their_node_id. clone ( ) ) {
2923
+ hash_map:: Entry :: Vacant ( e) => {
2924
+ e. insert ( Mutex :: new ( PerPeerState {
2925
+ latest_features : init_msg. features . clone ( ) ,
2926
+ } ) ) ;
2927
+ } ,
2928
+ hash_map:: Entry :: Occupied ( e) => {
2929
+ e. get ( ) . lock ( ) . unwrap ( ) . latest_features = init_msg. features . clone ( ) ;
2930
+ } ,
2931
+ }
2932
+ }
2933
+
2897
2934
let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
2898
2935
let channel_state = channel_state_lock. borrow_parts ( ) ;
2899
2936
let pending_msg_events = channel_state. pending_msg_events ;
@@ -3160,6 +3197,14 @@ impl<ChanSigner: ChannelKeys + Writeable> Writeable for ChannelManager<ChanSigne
3160
3197
}
3161
3198
}
3162
3199
3200
+ let per_peer_state = self . per_peer_state . write ( ) . unwrap ( ) ;
3201
+ ( per_peer_state. len ( ) as u64 ) . write ( writer) ?;
3202
+ for ( peer_pubkey, peer_state_mutex) in per_peer_state. iter ( ) {
3203
+ peer_pubkey. write ( writer) ?;
3204
+ let peer_state = peer_state_mutex. lock ( ) . unwrap ( ) ;
3205
+ peer_state. latest_features . write ( writer) ?;
3206
+ }
3207
+
3163
3208
Ok ( ( ) )
3164
3209
}
3165
3210
}
@@ -3293,6 +3338,16 @@ impl<'a, R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArg
3293
3338
claimable_htlcs. insert ( payment_hash, previous_hops) ;
3294
3339
}
3295
3340
3341
+ let peer_count: u64 = Readable :: read ( reader) ?;
3342
+ let mut per_peer_state = HashMap :: with_capacity ( cmp:: min ( peer_count as usize , 128 ) ) ;
3343
+ for _ in 0 ..peer_count {
3344
+ let peer_pubkey = Readable :: read ( reader) ?;
3345
+ let peer_state = PerPeerState {
3346
+ latest_features : Readable :: read ( reader) ?,
3347
+ } ;
3348
+ per_peer_state. insert ( peer_pubkey, Mutex :: new ( peer_state) ) ;
3349
+ }
3350
+
3296
3351
let channel_manager = ChannelManager {
3297
3352
genesis_hash,
3298
3353
fee_estimator : args. fee_estimator ,
@@ -3312,6 +3367,8 @@ impl<'a, R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArg
3312
3367
} ) ,
3313
3368
our_network_key : args. keys_manager . get_node_secret ( ) ,
3314
3369
3370
+ per_peer_state : RwLock :: new ( per_peer_state) ,
3371
+
3315
3372
pending_events : Mutex :: new ( Vec :: new ( ) ) ,
3316
3373
total_consistency_lock : RwLock :: new ( ( ) ) ,
3317
3374
keys_manager : args. keys_manager ,
0 commit comments