@@ -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 : InitFeatures ,
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.
@@ -628,6 +642,8 @@ impl<ChanSigner: ChannelKeys> ChannelManager<ChanSigner> {
628
642
} ) ,
629
643
our_network_key : keys_manager. get_node_secret ( ) ,
630
644
645
+ per_peer_state : RwLock :: new ( HashMap :: new ( ) ) ,
646
+
631
647
pending_events : Mutex :: new ( Vec :: new ( ) ) ,
632
648
total_consistency_lock : RwLock :: new ( ( ) ) ,
633
649
@@ -2798,6 +2814,7 @@ impl<ChanSigner: ChannelKeys> ChannelMessageHandler for ChannelManager<ChanSigne
2798
2814
let _ = self . total_consistency_lock . read ( ) . unwrap ( ) ;
2799
2815
let mut failed_channels = Vec :: new ( ) ;
2800
2816
let mut failed_payments = Vec :: new ( ) ;
2817
+ let mut no_channels_remain = true ;
2801
2818
{
2802
2819
let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
2803
2820
let channel_state = channel_state_lock. borrow_parts ( ) ;
@@ -2825,6 +2842,7 @@ impl<ChanSigner: ChannelKeys> ChannelMessageHandler for ChannelManager<ChanSigne
2825
2842
log_debug ! ( self , "Marking channels with {} disconnected and generating channel_updates" , log_pubkey!( their_node_id) ) ;
2826
2843
channel_state. by_id . retain ( |_, chan| {
2827
2844
if chan. get_their_node_id ( ) == * their_node_id {
2845
+ no_channels_remain = false ;
2828
2846
let failed_adds = chan. remove_uncommitted_htlcs_and_mark_paused ( ) ;
2829
2847
chan. to_disabled_marked ( ) ;
2830
2848
if !failed_adds. is_empty ( ) {
@@ -2861,6 +2879,10 @@ impl<ChanSigner: ChannelKeys> ChannelMessageHandler for ChannelManager<ChanSigne
2861
2879
}
2862
2880
} ) ;
2863
2881
}
2882
+ if no_channels_remain {
2883
+ self . per_peer_state . write ( ) . unwrap ( ) . remove ( their_node_id) ;
2884
+ }
2885
+
2864
2886
for failure in failed_channels. drain ( ..) {
2865
2887
self . finish_force_close_channel ( failure) ;
2866
2888
}
@@ -2871,10 +2893,25 @@ impl<ChanSigner: ChannelKeys> ChannelMessageHandler for ChannelManager<ChanSigne
2871
2893
}
2872
2894
}
2873
2895
2874
- fn peer_connected ( & self , their_node_id : & PublicKey , _init_msg : & msgs:: Init ) {
2896
+ fn peer_connected ( & self , their_node_id : & PublicKey , init_msg : & msgs:: Init ) {
2875
2897
log_debug ! ( self , "Generating channel_reestablish events for {}" , log_pubkey!( their_node_id) ) ;
2876
2898
2877
2899
let _ = self . total_consistency_lock . read ( ) . unwrap ( ) ;
2900
+
2901
+ {
2902
+ let mut peer_state_lock = self . per_peer_state . write ( ) . unwrap ( ) ;
2903
+ match peer_state_lock. entry ( their_node_id. clone ( ) ) {
2904
+ hash_map:: Entry :: Vacant ( e) => {
2905
+ e. insert ( Mutex :: new ( PerPeerState {
2906
+ latest_features : init_msg. features . clone ( ) ,
2907
+ } ) ) ;
2908
+ } ,
2909
+ hash_map:: Entry :: Occupied ( e) => {
2910
+ e. get ( ) . lock ( ) . unwrap ( ) . latest_features = init_msg. features . clone ( ) ;
2911
+ } ,
2912
+ }
2913
+ }
2914
+
2878
2915
let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
2879
2916
let channel_state = channel_state_lock. borrow_parts ( ) ;
2880
2917
let pending_msg_events = channel_state. pending_msg_events ;
@@ -3141,6 +3178,14 @@ impl<ChanSigner: ChannelKeys + Writeable> Writeable for ChannelManager<ChanSigne
3141
3178
}
3142
3179
}
3143
3180
3181
+ let per_peer_state = self . per_peer_state . write ( ) . unwrap ( ) ;
3182
+ ( per_peer_state. len ( ) as u64 ) . write ( writer) ?;
3183
+ for ( peer_pubkey, peer_state_mutex) in per_peer_state. iter ( ) {
3184
+ peer_pubkey. write ( writer) ?;
3185
+ let peer_state = peer_state_mutex. lock ( ) . unwrap ( ) ;
3186
+ peer_state. latest_features . write ( writer) ?;
3187
+ }
3188
+
3144
3189
Ok ( ( ) )
3145
3190
}
3146
3191
}
@@ -3274,6 +3319,16 @@ impl<'a, R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArg
3274
3319
claimable_htlcs. insert ( payment_hash, previous_hops) ;
3275
3320
}
3276
3321
3322
+ let peer_count: u64 = Readable :: read ( reader) ?;
3323
+ let mut per_peer_state = HashMap :: with_capacity ( cmp:: min ( peer_count as usize , 128 ) ) ;
3324
+ for _ in 0 ..peer_count {
3325
+ let peer_pubkey = Readable :: read ( reader) ?;
3326
+ let peer_state = PerPeerState {
3327
+ latest_features : Readable :: read ( reader) ?,
3328
+ } ;
3329
+ per_peer_state. insert ( peer_pubkey, Mutex :: new ( peer_state) ) ;
3330
+ }
3331
+
3277
3332
let channel_manager = ChannelManager {
3278
3333
genesis_hash,
3279
3334
fee_estimator : args. fee_estimator ,
@@ -3293,6 +3348,8 @@ impl<'a, R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArg
3293
3348
} ) ,
3294
3349
our_network_key : args. keys_manager . get_node_secret ( ) ,
3295
3350
3351
+ per_peer_state : RwLock :: new ( per_peer_state) ,
3352
+
3296
3353
pending_events : Mutex :: new ( Vec :: new ( ) ) ,
3297
3354
total_consistency_lock : RwLock :: new ( ( ) ) ,
3298
3355
keys_manager : args. keys_manager ,
0 commit comments