@@ -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