@@ -41,6 +41,7 @@ use lightning::{
4141use crate :: multiesplora:: MultiEsploraClient ;
4242use crate :: utils:: get_monitor_version;
4343use bitcoin:: util:: bip32:: ExtendedPrivKey ;
44+ use futures_util:: lock:: Mutex ;
4445use lightning:: events:: bump_transaction:: { BumpTransactionEventHandler , Wallet } ;
4546use lightning:: ln:: PaymentSecret ;
4647use lightning:: sign:: { EntropySource , InMemorySigner , NodeSigner , Recipient } ;
@@ -162,6 +163,7 @@ pub(crate) struct Node<S: MutinyStorage> {
162163 wallet : Arc < OnChainWallet < S > > ,
163164 logger : Arc < MutinyLogger > ,
164165 pub ( crate ) lsp_client : Option < LspClient > ,
166+ pub ( crate ) sync_lock : Arc < Mutex < ( ) > > ,
165167 stop : Arc < AtomicBool > ,
166168 #[ cfg( target_arch = "wasm32" ) ]
167169 websocket_proxy_addr : String ,
@@ -549,11 +551,14 @@ impl<S: MutinyStorage> Node<S> {
549551 keys_manager. get_node_id( Recipient :: Node ) . unwrap( )
550552 ) ;
551553
554+ let sync_lock = Arc :: new ( Mutex :: new ( ( ) ) ) ;
555+
552556 // Here we re-attempt to persist any monitors that failed to persist previously.
553557 let retry_logger = logger. clone ( ) ;
554558 let retry_persister = persister. clone ( ) ;
555559 let retry_stop = stop. clone ( ) ;
556560 let retry_chain_monitor = chain_monitor. clone ( ) ;
561+ let retry_sync_lock = sync_lock. clone ( ) ;
557562 utils:: spawn ( async move {
558563 // sleep 3 seconds before checking, we won't have any pending updates on startup
559564 sleep ( 3_000 ) . await ;
@@ -563,7 +568,11 @@ impl<S: MutinyStorage> Node<S> {
563568 break ;
564569 }
565570
566- let updates = retry_chain_monitor. list_pending_monitor_updates ( ) ;
571+ let updates = {
572+ let _lock = retry_sync_lock. lock ( ) . await ;
573+ retry_chain_monitor. list_pending_monitor_updates ( )
574+ } ;
575+
567576 for ( funding_txo, update_ids) in updates {
568577 // if there are no updates, skip
569578 if update_ids. is_empty ( ) {
@@ -642,6 +651,7 @@ impl<S: MutinyStorage> Node<S> {
642651 wallet,
643652 logger,
644653 lsp_client,
654+ sync_lock,
645655 stop,
646656 #[ cfg( target_arch = "wasm32" ) ]
647657 websocket_proxy_addr,
0 commit comments