diff --git a/src/builder.rs b/src/builder.rs index 7f15cced6..0ef3434d6 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -1668,11 +1668,13 @@ fn build_with_store_internal( }; let (stop_sender, _) = tokio::sync::watch::channel(()); + let (background_processor_stop_sender, _) = tokio::sync::watch::channel(()); let is_running = Arc::new(RwLock::new(false)); Ok(Node { runtime, stop_sender, + background_processor_stop_sender, config, wallet, chain_source, diff --git a/src/lib.rs b/src/lib.rs index 1604d1b46..da86fce73 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -180,6 +180,7 @@ uniffi::include_scaffolding!("ldk_node"); pub struct Node { runtime: Arc, stop_sender: tokio::sync::watch::Sender<()>, + background_processor_stop_sender: tokio::sync::watch::Sender<()>, config: Arc, wallet: Arc, chain_source: Arc, @@ -525,7 +526,7 @@ impl Node { let background_logger = Arc::clone(&self.logger); let background_error_logger = Arc::clone(&self.logger); let background_scorer = Arc::clone(&self.scorer); - let stop_bp = self.stop_sender.subscribe(); + let stop_bp = self.background_processor_stop_sender.subscribe(); let sleeper_logger = Arc::clone(&self.logger); let sleeper = move |d| { let mut stop = stop_bp.clone(); @@ -604,21 +605,20 @@ impl Node { log_info!(self.logger, "Shutting down LDK Node with node ID {}...", self.node_id()); - // Stop any runtime-dependant chain sources. - self.chain_source.stop(); - - // Stop the runtime. - match self.stop_sender.send(()) { - Ok(_) => log_trace!(self.logger, "Sent shutdown signal to background tasks."), - Err(e) => { + // Stop background tasks. + self.stop_sender + .send(()) + .map(|_| { + log_trace!(self.logger, "Sent shutdown signal to background tasks."); + }) + .unwrap_or_else(|e| { log_error!( self.logger, "Failed to send shutdown signal. This should never happen: {}", e ); debug_assert!(false); - }, - } + }); // Cancel cancellable background tasks self.runtime.abort_cancellable_background_tasks(); @@ -627,12 +627,27 @@ impl Node { self.peer_manager.disconnect_all_peers(); log_debug!(self.logger, "Disconnected all network peers."); + // Wait until non-cancellable background tasks (mod LDK's background processor) are done. + self.runtime.wait_on_background_tasks(); + // Stop any runtime-dependant chain sources. self.chain_source.stop(); log_debug!(self.logger, "Stopped chain sources."); - // Wait until non-cancellable background tasks (mod LDK's background processor) are done. - self.runtime.wait_on_background_tasks(); + // Stop the background processor. + self.background_processor_stop_sender + .send(()) + .map(|_| { + log_trace!(self.logger, "Sent shutdown signal to background processor."); + }) + .unwrap_or_else(|e| { + log_error!( + self.logger, + "Failed to send shutdown signal. This should never happen: {}", + e + ); + debug_assert!(false); + }); // Finally, wait until background processing stopped, at least until a timeout is reached. self.runtime.wait_on_background_processor_task();