Skip to content

Commit f38e031

Browse files
committed
f Skip unnecessary wallet syncs, but wait
1 parent cfbd887 commit f38e031

File tree

2 files changed

+70
-15
lines changed

2 files changed

+70
-15
lines changed

src/lib.rs

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -542,11 +542,15 @@ impl Node {
542542
match wallet.sync().await {
543543
Ok(()) => log_info!(
544544
sync_logger,
545-
"On-chain wallet sync finished in {}ms.",
545+
"Background sync of on-chain wallet finished in {}ms.",
546546
now.elapsed().as_millis()
547547
),
548548
Err(err) => {
549-
log_error!(sync_logger, "On-chain wallet sync failed: {}", err)
549+
log_error!(
550+
sync_logger,
551+
"Background sync of on-chain wallet failed: {}",
552+
err
553+
)
550554
}
551555
}
552556
tokio::time::sleep(Duration::from_secs(20)).await;
@@ -570,11 +574,11 @@ impl Node {
570574
match tx_sync.sync(confirmables).await {
571575
Ok(()) => log_info!(
572576
sync_logger,
573-
"Lightning wallet sync finished in {}ms.",
577+
"Background sync of Lightning wallet finished in {}ms.",
574578
now.elapsed().as_millis()
575579
),
576580
Err(e) => {
577-
log_error!(sync_logger, "Lightning wallet sync failed: {}", e)
581+
log_error!(sync_logger, "Background sync of Lightning wallet failed: {}", e)
578582
}
579583
}
580584
tokio::time::sleep(Duration::from_secs(5)).await;
@@ -798,22 +802,54 @@ impl Node {
798802
let tx_sync = Arc::clone(&self.tx_sync);
799803
let sync_cman = Arc::clone(&self.channel_manager);
800804
let sync_cmon = Arc::clone(&self.chain_monitor);
805+
let sync_logger = Arc::clone(&self.logger);
801806
let confirmables = vec![
802807
&*sync_cman as &(dyn Confirm + Sync + Send),
803808
&*sync_cmon as &(dyn Confirm + Sync + Send),
804809
];
805810

806811
let runtime = runtime_lock.as_ref().unwrap();
807812
tokio::task::block_in_place(move || {
808-
tokio::runtime::Builder::new_current_thread()
809-
.enable_all()
810-
.build()
811-
.unwrap()
812-
.block_on(async move { wallet.sync().await })
813+
tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap().block_on(
814+
async move {
815+
let now = Instant::now();
816+
match wallet.sync().await {
817+
Ok(()) => {
818+
log_info!(
819+
sync_logger,
820+
"Sync of on-chain wallet finished in {}ms.",
821+
now.elapsed().as_millis()
822+
);
823+
Ok(())
824+
}
825+
Err(e) => {
826+
log_error!(sync_logger, "Sync of on-chain wallet failed: {}", e);
827+
Err(e)
828+
}
829+
}
830+
},
831+
)
813832
})?;
814833

834+
let sync_logger = Arc::clone(&self.logger);
815835
tokio::task::block_in_place(move || {
816-
runtime.tokio_runtime.block_on(async move { tx_sync.sync(confirmables).await })
836+
runtime.tokio_runtime.block_on(async move {
837+
let now = Instant::now();
838+
match tx_sync.sync(confirmables).await {
839+
Ok(()) => {
840+
log_info!(
841+
sync_logger,
842+
"Sync of Lightning wallet finished in {}ms.",
843+
now.elapsed().as_millis()
844+
);
845+
Ok(())
846+
}
847+
Err(e) => {
848+
log_error!(sync_logger, "Sync of Lightning wallet failed: {}", e);
849+
Err(e)
850+
}
851+
}
852+
})
817853
})?;
818854

819855
Ok(())

src/wallet.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::logger::{log_error, log_trace, FilesystemLogger, Logger};
1+
use crate::logger::{log_error, log_info, log_trace, FilesystemLogger, Logger};
22

33
use crate::Error;
44

@@ -25,7 +25,7 @@ use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, Signing};
2525
use bitcoin::{Script, Transaction, TxOut};
2626

2727
use std::collections::HashMap;
28-
use std::sync::{Arc, Mutex, RwLock};
28+
use std::sync::{Arc, Condvar, Mutex, RwLock};
2929

3030
pub struct Wallet<D>
3131
where
@@ -38,6 +38,7 @@ where
3838
// A cache storing the most recently retrieved fee rate estimations.
3939
fee_rate_cache: RwLock<HashMap<ConfirmationTarget, FeeRate>>,
4040
tokio_runtime: RwLock<Option<Arc<tokio::runtime::Runtime>>>,
41+
sync_lock: (Mutex<()>, Condvar),
4142
logger: Arc<FilesystemLogger>,
4243
}
4344

@@ -51,10 +52,24 @@ where
5152
let inner = Mutex::new(wallet);
5253
let fee_rate_cache = RwLock::new(HashMap::new());
5354
let tokio_runtime = RwLock::new(None);
54-
Self { blockchain, inner, fee_rate_cache, tokio_runtime, logger }
55+
let sync_lock = (Mutex::new(()), Condvar::new());
56+
Self { blockchain, inner, fee_rate_cache, tokio_runtime, sync_lock, logger }
5557
}
5658

5759
pub(crate) async fn sync(&self) -> Result<(), Error> {
60+
let (lock, cvar) = &self.sync_lock;
61+
62+
let guard = match lock.try_lock() {
63+
Ok(guard) => guard,
64+
Err(_) => {
65+
log_info!(self.logger, "Sync in progress, skipping.");
66+
let guard = cvar.wait(lock.lock().unwrap());
67+
drop(guard);
68+
cvar.notify_all();
69+
return Ok(());
70+
}
71+
};
72+
5873
match self.update_fee_estimates().await {
5974
Ok(()) => (),
6075
Err(e) => {
@@ -64,13 +79,17 @@ where
6479
}
6580

6681
let sync_options = SyncOptions { progress: None };
67-
match self.inner.lock().unwrap().sync(&self.blockchain, sync_options).await {
82+
let res = match self.inner.lock().unwrap().sync(&self.blockchain, sync_options).await {
6883
Ok(()) => Ok(()),
6984
Err(e) => {
7085
log_error!(self.logger, "Wallet sync error: {}", e);
7186
Err(From::from(e))
7287
}
73-
}
88+
};
89+
90+
drop(guard);
91+
cvar.notify_all();
92+
res
7493
}
7594

7695
pub(crate) fn set_runtime(&self, tokio_runtime: Arc<tokio::runtime::Runtime>) {

0 commit comments

Comments
 (0)