@@ -2626,8 +2626,13 @@ where
2626
2626
self . close_channel_internal ( channel_id, counterparty_node_id, target_feerate_sats_per_1000_weight, shutdown_script)
2627
2627
}
2628
2628
2629
- #[inline]
2630
2629
fn finish_force_close_channel ( & self , shutdown_res : ShutdownResult ) {
2630
+ debug_assert_ne ! ( self . per_peer_state. held_by_thread( ) , LockHeldState :: HeldByThread ) ;
2631
+ #[ cfg( debug_assertions) ]
2632
+ for ( _, peer) in self . per_peer_state . read ( ) . unwrap ( ) . iter ( ) {
2633
+ debug_assert_ne ! ( peer. held_by_thread( ) , LockHeldState :: HeldByThread ) ;
2634
+ }
2635
+
2631
2636
let ( monitor_update_option, mut failed_htlcs) = shutdown_res;
2632
2637
log_debug ! ( self . logger, "Finishing force-closure of channel with {} HTLCs to fail" , failed_htlcs. len( ) ) ;
2633
2638
for htlc_source in failed_htlcs. drain ( ..) {
@@ -2653,8 +2658,7 @@ where
2653
2658
let peer_state_mutex = per_peer_state. get ( peer_node_id)
2654
2659
. ok_or_else ( || APIError :: ChannelUnavailable { err : format ! ( "Can't find a peer matching the passed counterparty node_id {}" , peer_node_id) } ) ?;
2655
2660
let ( update_opt, counterparty_node_id) = {
2656
- let mut peer_state_lock = peer_state_mutex.lock().unwrap();
2657
- let peer_state = &mut *peer_state_lock;
2661
+ let mut peer_state = peer_state_mutex. lock ( ) . unwrap ( ) ;
2658
2662
let closure_reason = if let Some ( peer_msg) = peer_msg {
2659
2663
ClosureReason :: CounterpartyForceClosed { peer_msg : UntrustedString ( peer_msg. to_string ( ) ) }
2660
2664
} else {
@@ -2664,6 +2668,8 @@ where
2664
2668
log_error ! ( self . logger, "Force-closing channel {}" , channel_id) ;
2665
2669
self . issue_channel_close_events ( & chan_phase_entry. get ( ) . context ( ) , closure_reason) ;
2666
2670
let mut chan_phase = remove_channel_phase ! ( self , chan_phase_entry) ;
2671
+ mem:: drop ( peer_state) ;
2672
+ mem:: drop ( per_peer_state) ;
2667
2673
match chan_phase {
2668
2674
ChannelPhase :: Funded ( mut chan) => {
2669
2675
self . finish_force_close_channel ( chan. context . force_shutdown ( broadcast) ) ;
@@ -2686,10 +2692,17 @@ where
2686
2692
}
2687
2693
} ;
2688
2694
if let Some ( update) = update_opt {
2689
- let mut peer_state = peer_state_mutex.lock().unwrap();
2690
- peer_state.pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
2691
- msg: update
2692
- });
2695
+ // Try to send the `BroadcastChannelUpdate` to the peer we just force-closed on, but if
2696
+ // not try to broadcast it via whatever peer we have.
2697
+ let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
2698
+ let a_peer_state_opt = per_peer_state. get ( peer_node_id)
2699
+ . ok_or ( per_peer_state. values ( ) . next ( ) ) ;
2700
+ if let Ok ( a_peer_state_mutex) = a_peer_state_opt {
2701
+ let mut a_peer_state = a_peer_state_mutex. lock ( ) . unwrap ( ) ;
2702
+ a_peer_state. pending_msg_events . push ( events:: MessageSendEvent :: BroadcastChannelUpdate {
2703
+ msg : update
2704
+ } ) ;
2705
+ }
2693
2706
}
2694
2707
2695
2708
Ok ( counterparty_node_id)
@@ -4627,8 +4640,9 @@ where
4627
4640
let mut handle_errors: Vec < ( Result < ( ) , _ > , _ ) > = Vec :: new ( ) ;
4628
4641
let mut timed_out_mpp_htlcs = Vec :: new ( ) ;
4629
4642
let mut pending_peers_awaiting_removal = Vec :: new ( ) ;
4643
+ let mut shutdown_channels = Vec :: new ( ) ;
4630
4644
4631
- let process_unfunded_channel_tick = |
4645
+ let mut process_unfunded_channel_tick = |
4632
4646
chan_id : & ChannelId ,
4633
4647
context : & mut ChannelContext < SP > ,
4634
4648
unfunded_context : & mut UnfundedChannelContext ,
@@ -4641,7 +4655,7 @@ where
4641
4655
"Force-closing pending channel with ID {} for not establishing in a timely manner" , chan_id) ;
4642
4656
update_maps_on_chan_removal ! ( self , & context) ;
4643
4657
self . issue_channel_close_events ( & context, ClosureReason :: HolderForceClosed ) ;
4644
- self.finish_force_close_channel (context.force_shutdown(false));
4658
+ shutdown_channels . push ( context. force_shutdown ( false ) ) ;
4645
4659
pending_msg_events. push ( MessageSendEvent :: HandleError {
4646
4660
node_id : counterparty_node_id,
4647
4661
action : msgs:: ErrorAction :: SendErrorMessage {
@@ -4834,6 +4848,10 @@ where
4834
4848
let _ = handle_error ! ( self , err, counterparty_node_id) ;
4835
4849
}
4836
4850
4851
+ for shutdown_res in shutdown_channels {
4852
+ self . finish_force_close_channel ( shutdown_res) ;
4853
+ }
4854
+
4837
4855
self . pending_outbound_payments . remove_stale_payments ( & self . pending_events ) ;
4838
4856
4839
4857
// Technically we don't need to do this here, but if we have holding cell entries in a
@@ -4990,6 +5008,7 @@ where
4990
5008
// This ensures that future code doesn't introduce a lock-order requirement for
4991
5009
// `forward_htlcs` to be locked after the `per_peer_state` peer locks, which calling
4992
5010
// this function with any `per_peer_state` peer lock acquired would.
5011
+ #[ cfg( debug_assertions) ]
4993
5012
for ( _, peer) in self . per_peer_state . read ( ) . unwrap ( ) . iter ( ) {
4994
5013
debug_assert_ne ! ( peer. held_by_thread( ) , LockHeldState :: HeldByThread ) ;
4995
5014
}
@@ -5997,7 +6016,8 @@ where
5997
6016
}
5998
6017
5999
6018
fn internal_shutdown ( & self , counterparty_node_id : & PublicKey , msg : & msgs:: Shutdown ) -> Result < ( ) , MsgHandleErrInternal > {
6000
- let mut dropped_htlcs: Vec<(HTLCSource, PaymentHash)>;
6019
+ let mut dropped_htlcs: Vec < ( HTLCSource , PaymentHash ) > = Vec :: new ( ) ;
6020
+ let mut finish_shutdown = None ;
6001
6021
{
6002
6022
let per_peer_state = self . per_peer_state . read ( ) . unwrap ( ) ;
6003
6023
let peer_state_mutex = per_peer_state. get ( counterparty_node_id)
@@ -6042,8 +6062,7 @@ where
6042
6062
log_error ! ( self . logger, "Immediately closing unfunded channel {} as peer asked to cooperatively shut it down (which is unnecessary)" , & msg. channel_id) ;
6043
6063
self . issue_channel_close_events ( & context, ClosureReason :: CounterpartyCoopClosedUnfundedChannel ) ;
6044
6064
let mut chan = remove_channel_phase ! ( self , chan_phase_entry) ;
6045
- self.finish_force_close_channel(chan.context_mut().force_shutdown(false));
6046
- return Ok(());
6065
+ finish_shutdown = Some ( chan. context_mut ( ) . force_shutdown ( false ) ) ;
6047
6066
} ,
6048
6067
}
6049
6068
} else {
@@ -6055,6 +6074,9 @@ where
6055
6074
let reason = HTLCFailReason :: from_failure_code ( 0x4000 | 8 ) ;
6056
6075
self . fail_htlc_backwards_internal ( & htlc_source. 0 , & htlc_source. 1 , & reason, receiver) ;
6057
6076
}
6077
+ if let Some ( shutdown_res) = finish_shutdown {
6078
+ self . finish_force_close_channel ( shutdown_res) ;
6079
+ }
6058
6080
6059
6081
Ok ( ( ) )
6060
6082
}
0 commit comments