@@ -3628,38 +3628,50 @@ macro_rules! handle_monitor_update_completion {
3628
3628
} }
3629
3629
}
3630
3630
3631
+ /// Returns whether the monitor update is completed, `false` if the update is in-progress.
3632
+ fn handle_monitor_update_res<CM: AChannelManager, LG: Logger>(
3633
+ cm: &CM, update_res: ChannelMonitorUpdateStatus, channel_id: ChannelId, logger: LG,
3634
+ ) -> bool {
3635
+ debug_assert!(cm.get_cm().background_events_processed_since_startup.load(Ordering::Acquire));
3636
+ match update_res {
3637
+ ChannelMonitorUpdateStatus::UnrecoverableError => {
3638
+ let err_str = "ChannelMonitor[Update] persistence failed unrecoverably. This indicates we cannot continue normal operation and must shut down.";
3639
+ log_error!(logger, "{}", err_str);
3640
+ panic!("{}", err_str);
3641
+ },
3642
+ ChannelMonitorUpdateStatus::InProgress => {
3643
+ #[cfg(not(any(test, feature = "_externalize_tests")))]
3644
+ if cm.get_cm().monitor_update_type.swap(1, Ordering::Relaxed) == 2 {
3645
+ panic!("Cannot use both ChannelMonitorUpdateStatus modes InProgress and Completed without restart");
3646
+ }
3647
+ log_debug!(logger, "ChannelMonitor update for {} in flight, holding messages until the update completes.",
3648
+ channel_id);
3649
+ false
3650
+ },
3651
+ ChannelMonitorUpdateStatus::Completed => {
3652
+ #[cfg(not(any(test, feature = "_externalize_tests")))]
3653
+ if cm.get_cm().monitor_update_type.swap(2, Ordering::Relaxed) == 1 {
3654
+ panic!("Cannot use both ChannelMonitorUpdateStatus modes InProgress and Completed without restart");
3655
+ }
3656
+ true
3657
+ },
3658
+ }
3659
+ }
3660
+
3631
3661
macro_rules! handle_new_monitor_update {
3632
- ($self: ident, $update_res: expr, $logger: expr, $channel_id: expr, _internal, $completed: expr) => { {
3633
- debug_assert!($self.background_events_processed_since_startup.load(Ordering::Acquire));
3634
- match $update_res {
3635
- ChannelMonitorUpdateStatus::UnrecoverableError => {
3636
- let err_str = "ChannelMonitor[Update] persistence failed unrecoverably. This indicates we cannot continue normal operation and must shut down.";
3637
- log_error!($logger, "{}", err_str);
3638
- panic!("{}", err_str);
3639
- },
3640
- ChannelMonitorUpdateStatus::InProgress => {
3641
- #[cfg(not(any(test, feature = "_externalize_tests")))]
3642
- if $self.monitor_update_type.swap(1, Ordering::Relaxed) == 2 {
3643
- panic!("Cannot use both ChannelMonitorUpdateStatus modes InProgress and Completed without restart");
3644
- }
3645
- log_debug!($logger, "ChannelMonitor update for {} in flight, holding messages until the update completes.",
3646
- $channel_id);
3647
- false
3648
- },
3649
- ChannelMonitorUpdateStatus::Completed => {
3650
- #[cfg(not(any(test, feature = "_externalize_tests")))]
3651
- if $self.monitor_update_type.swap(2, Ordering::Relaxed) == 1 {
3652
- panic!("Cannot use both ChannelMonitorUpdateStatus modes InProgress and Completed without restart");
3653
- }
3654
- $completed;
3655
- true
3656
- },
3657
- }
3658
- } };
3659
3662
($self: ident, $update_res: expr, $peer_state_lock: expr, $peer_state: expr, $per_peer_state_lock: expr, $chan: expr, INITIAL_MONITOR) => {
3660
3663
let logger = WithChannelContext::from(&$self.logger, &$chan.context, None);
3661
- handle_new_monitor_update!($self, $update_res, logger, $chan.context.channel_id(), _internal,
3662
- handle_monitor_update_completion!($self, $peer_state_lock, $peer_state, $per_peer_state_lock, $chan))
3664
+ let update_completed =
3665
+ handle_monitor_update_res($self, $update_res, $chan.context.channel_id(), logger);
3666
+ if update_completed {
3667
+ handle_monitor_update_completion!(
3668
+ $self,
3669
+ $peer_state_lock,
3670
+ $peer_state,
3671
+ $per_peer_state_lock,
3672
+ $chan
3673
+ );
3674
+ }
3663
3675
};
3664
3676
(
3665
3677
$self: ident, $funding_txo: expr, $update: expr, $peer_state: expr, $logger: expr,
@@ -3682,7 +3694,11 @@ macro_rules! handle_new_monitor_update {
3682
3694
if $self.background_events_processed_since_startup.load(Ordering::Acquire) {
3683
3695
let update_res =
3684
3696
$self.chain_monitor.update_channel($chan_id, &$in_flight_updates[$update_idx]);
3685
- handle_new_monitor_update!($self, update_res, $logger, $chan_id, _internal, $completed)
3697
+ let update_completed = handle_monitor_update_res($self, update_res, $chan_id, $logger);
3698
+ if update_completed {
3699
+ $completed;
3700
+ }
3701
+ update_completed
3686
3702
} else {
3687
3703
// We blindly assume that the ChannelMonitorUpdate will be regenerated on startup if we
3688
3704
// fail to persist it. This is a fairly safe assumption, however, since anything we do
0 commit comments