Merge pull request #1029 from TheBlueMatt/2021-07-log-channel-close
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Thu, 5 Aug 2021 21:05:43 +0000 (21:05 +0000)
committerGitHub <noreply@github.com>
Thu, 5 Aug 2021 21:05:43 +0000 (21:05 +0000)
Log when a channel is closed on startup due to stale ChannelManager

lightning-background-processor/src/lib.rs
lightning/src/ln/channelmanager.rs

index 55ac14c048c412e8a9d0a7f17318d62b7569b3f6..afa3633bee69bea6b4fd2a8e2bf330a55147d143 100644 (file)
@@ -39,6 +39,7 @@ use std::ops::Deref;
 /// then there is a risk of channels force-closing on startup when the manager realizes it's
 /// outdated. However, as long as `ChannelMonitor` backups are sound, no funds besides those used
 /// for unilateral chain closure fees are at risk.
+#[must_use = "BackgroundProcessor will immediately stop on drop. It should be stored until shutdown."]
 pub struct BackgroundProcessor {
        stop_thread: Arc<AtomicBool>,
        thread_handle: Option<JoinHandle<Result<(), std::io::Error>>>,
index afbfd0ee970da43bc050c488281cf16da4c4e8c7..24c0c688cf0843274a61954433098d31324810a5 100644 (file)
@@ -5000,6 +5000,10 @@ impl<'a, Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
                                                channel.get_cur_counterparty_commitment_transaction_number() > monitor.get_cur_counterparty_commitment_number() ||
                                                channel.get_latest_monitor_update_id() < monitor.get_latest_update_id() {
                                        // But if the channel is behind of the monitor, close the channel:
+                                       log_error!(args.logger, "A ChannelManager is stale compared to the current ChannelMonitor!");
+                                       log_error!(args.logger, " The channel will be force-closed and the latest commitment transaction from the ChannelMonitor broadcast.");
+                                       log_error!(args.logger, " The ChannelMonitor for channel {} is at update_id {} but the ChannelManager is at update_id {}.",
+                                               log_bytes!(channel.channel_id()), monitor.get_latest_update_id(), channel.get_latest_monitor_update_id());
                                        let (_, mut new_failed_htlcs) = channel.force_shutdown(true);
                                        failed_htlcs.append(&mut new_failed_htlcs);
                                        monitor.broadcast_latest_holder_commitment_txn(&args.tx_broadcaster, &args.logger);