From 6982d0aedb50a4273abcb8529fe95117ba3adefc Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Sun, 13 Aug 2023 22:40:25 +0000 Subject: [PATCH] Attempt a last-ditch ChannelManager persistence if the BP exits If the BP exits because it failed to write our ChannelManager to disk, we'll probably lose some channels on startup. However, there's still some chance for us to write the `ChannelManager` in a retry, which we should do before we exit. --- src/main.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 938df12..3f01cfe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -914,12 +914,11 @@ async fn start_ldk() { // Exit if either CLI polling exits or the background processor exits (which shouldn't happen // unless we fail to write to the filesystem). + let mut bg_res = Ok(Ok(())); tokio::select! { _ = cli_poll => {}, - bg_res = &mut background_processor => { - stop_listen_connect.store(true, Ordering::Release); - peer_manager.disconnect_all_peers(); - panic!("ERR: background processing stopped with result {:?}, exiting", bg_res); + bg_exit = &mut background_processor => { + bg_res = bg_exit; }, } @@ -928,6 +927,21 @@ async fn start_ldk() { stop_listen_connect.store(true, Ordering::Release); peer_manager.disconnect_all_peers(); + if let Err(e) = bg_res { + let persist_res = persister.persist("manager", &*channel_manager).unwrap(); + use lightning::util::logger::Logger; + lightning::log_error!( + &*logger, + "Last-ditch ChannelManager persistence result: {:?}", + persist_res + ); + panic!( + "ERR: background processing stopped with result {:?}, exiting.\n\ + Last-ditch ChannelManager persistence result {:?}", + e, persist_res + ); + } + // Stop the background processor. if !bp_exit.is_closed() { bp_exit.send(()).unwrap(); -- 2.30.2