@@ -3271,8 +3271,8 @@ macro_rules! locked_close_channel {
3271
3271
}};
3272
3272
($self: ident, $peer_state: expr, $funded_chan: expr, $shutdown_res_mut: expr, FUNDED) => {{
3273
3273
if let Some((_, funding_txo, _, update)) = $shutdown_res_mut.monitor_update.take() {
3274
- handle_new_monitor_update !($self, funding_txo, update, $peer_state,
3275
- $funded_chan.context, REMAIN_LOCKED_UPDATE_ACTIONS_PROCESSED_LATER );
3274
+ handle_new_monitor_update_actions_processed_later !($self, funding_txo, update, $peer_state,
3275
+ $funded_chan.context);
3276
3276
}
3277
3277
// If there's a possibility that we need to generate further monitor updates for this
3278
3278
// channel, we need to store the last update_id of it. However, we don't want to insert
@@ -3683,6 +3683,42 @@ macro_rules! handle_post_close_monitor_update {
3683
3683
}};
3684
3684
}
3685
3685
3686
+ /// Handles a new monitor update without dropping peer_state locks and calling
3687
+ /// [`ChannelManager::handle_monitor_update_completion_actions`] if the monitor update completed
3688
+ /// synchronously.
3689
+ ///
3690
+ /// Useful because monitor updates need to be handled in the same mutex where the channel generated
3691
+ /// them (otherwise they can end up getting applied out-of-order) but it's not always possible to
3692
+ /// drop the aforementioned peer state locks at a given callsite. In this situation, use this macro
3693
+ /// to apply the monitor update immediately and handle the monitor update completion actions at a
3694
+ /// later time.
3695
+ macro_rules! handle_new_monitor_update_actions_processed_later {
3696
+ (
3697
+ $self: ident, $funding_txo: expr, $update: expr, $peer_state: expr, $chan_context: expr
3698
+ ) => {{
3699
+ let logger = WithChannelContext::from(&$self.logger, &$chan_context, None);
3700
+ let chan_id = $chan_context.channel_id();
3701
+ let counterparty_node_id = $chan_context.get_counterparty_node_id();
3702
+ let in_flight_updates;
3703
+ let idx;
3704
+ handle_new_monitor_update!(
3705
+ $self,
3706
+ $funding_txo,
3707
+ $update,
3708
+ $peer_state,
3709
+ logger,
3710
+ chan_id,
3711
+ counterparty_node_id,
3712
+ in_flight_updates,
3713
+ idx,
3714
+ _internal_outer,
3715
+ {
3716
+ let _ = in_flight_updates.remove(idx);
3717
+ }
3718
+ )
3719
+ }};
3720
+ }
3721
+
3686
3722
macro_rules! handle_new_monitor_update {
3687
3723
(
3688
3724
$self: ident, $funding_txo: expr, $update: expr, $peer_state: expr, $logger: expr,
@@ -3732,31 +3768,6 @@ macro_rules! handle_new_monitor_update {
3732
3768
false
3733
3769
}
3734
3770
}};
3735
- (
3736
- $self: ident, $funding_txo: expr, $update: expr, $peer_state: expr, $chan_context: expr,
3737
- REMAIN_LOCKED_UPDATE_ACTIONS_PROCESSED_LATER
3738
- ) => {{
3739
- let logger = WithChannelContext::from(&$self.logger, &$chan_context, None);
3740
- let chan_id = $chan_context.channel_id();
3741
- let counterparty_node_id = $chan_context.get_counterparty_node_id();
3742
- let in_flight_updates;
3743
- let idx;
3744
- handle_new_monitor_update!(
3745
- $self,
3746
- $funding_txo,
3747
- $update,
3748
- $peer_state,
3749
- logger,
3750
- chan_id,
3751
- counterparty_node_id,
3752
- in_flight_updates,
3753
- idx,
3754
- _internal_outer,
3755
- {
3756
- let _ = in_flight_updates.remove(idx);
3757
- }
3758
- )
3759
- }};
3760
3771
(
3761
3772
$self: ident, $funding_txo: expr, $update: expr, $peer_state_lock: expr, $peer_state: expr,
3762
3773
$per_peer_state_lock: expr, $chan: expr
@@ -14039,13 +14050,12 @@ where
14039
14050
insert_short_channel_id!(short_to_chan_info, funded_channel);
14040
14051
14041
14052
if let Some(monitor_update) = monitor_update_opt {
14042
- handle_new_monitor_update !(
14053
+ handle_new_monitor_update_actions_processed_later !(
14043
14054
self,
14044
14055
funding_txo,
14045
14056
monitor_update,
14046
14057
peer_state,
14047
- funded_channel.context,
14048
- REMAIN_LOCKED_UPDATE_ACTIONS_PROCESSED_LATER
14058
+ funded_channel.context
14049
14059
);
14050
14060
to_process_monitor_update_actions.push((
14051
14061
counterparty_node_id, channel_id
0 commit comments