Skip to content

Commit 9e9f3ee

Browse files
committed
Make wallet sync intervals configurable
We make the wallet background syncing intervals configurable, however enforcing a lower bound of 10 seconds.
1 parent 0dc3111 commit 9e9f3ee

File tree

2 files changed

+85
-61
lines changed

2 files changed

+85
-61
lines changed

bindings/ldk_node.udl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ dictionary Config {
66
Network network;
77
NetAddress? listening_address;
88
u32 default_cltv_expiry_delta;
9+
u64 onchain_wallet_sync_interval_secs;
10+
u64 wallet_sync_interval_secs;
911
LogLevel log_level;
1012
};
1113

src/lib.rs

Lines changed: 83 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ use types::{
118118
pub use types::{ChannelDetails, ChannelId, PeerDetails, UserChannelId};
119119
use wallet::Wallet;
120120

121-
use logger::{log_error, log_info, FilesystemLogger, Logger};
121+
use logger::{log_error, log_info, log_trace, FilesystemLogger, Logger};
122122

123123
use lightning::chain::keysinterface::EntropySource;
124124
use lightning::chain::{chainmonitor, BestBlock, Confirm, Watch};
@@ -173,7 +173,8 @@ const DEFAULT_STORAGE_DIR_PATH: &str = "/tmp/ldk_node/";
173173
const DEFAULT_NETWORK: Network = Network::Bitcoin;
174174
const DEFAULT_LISTENING_ADDR: &str = "0.0.0.0:9735";
175175
const DEFAULT_CLTV_EXPIRY_DELTA: u32 = 144;
176-
const DEFAULT_ESPLORA_SERVER_URL: &str = "https://blockstream.info/api";
176+
const DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS: u64 = 60;
177+
const DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS: u64 = 20;
177178
const DEFAULT_LOG_LEVEL: LogLevel = LogLevel::Debug;
178179

179180
// The 'stop gap' parameter used by BDK's wallet sync. This seems to configure the threshold
@@ -183,6 +184,9 @@ const BDK_CLIENT_STOP_GAP: usize = 20;
183184
// The number of concurrent requests made against the API provider.
184185
const BDK_CLIENT_CONCURRENCY: u8 = 8;
185186

187+
// The default Esplora server we're using.
188+
const DEFAULT_ESPLORA_SERVER_URL: &str = "https://blockstream.info/api";
189+
186190
// The timeout after which we abandon retrying failed payments.
187191
const LDK_PAYMENT_RETRY_TIMEOUT: Duration = Duration::from_secs(10);
188192

@@ -203,13 +207,15 @@ const WALLET_KEYS_SEED_LEN: usize = 64;
203207
///
204208
/// ### Defaults
205209
///
206-
/// | Parameter | Value |
207-
/// |-----------------------------|------------------|
208-
/// | `storage_dir_path` | /tmp/ldk_node/ |
209-
/// | `network` | Network::Bitcoin |
210-
/// | `listening_address` | 0.0.0.0:9735 |
211-
/// | `default_cltv_expiry_delta` | 144 |
212-
/// | `log_level` | `Debug` |
210+
/// | Parameter | Value |
211+
/// |----------------------------------------|------------------|
212+
/// | `storage_dir_path` | /tmp/ldk_node/ |
213+
/// | `network` | Network::Bitcoin |
214+
/// | `listening_address` | 0.0.0.0:9735 |
215+
/// | `default_cltv_expiry_delta` | 144 |
216+
/// | `onchain_wallet_sync_interval_secs` | 60 |
217+
/// | `wallet_sync_interval_secs` | 20 |
218+
/// | `log_level` | `Debug` |
213219
///
214220
pub struct Config {
215221
/// The path where the underlying LDK and BDK persist their data.
@@ -220,6 +226,14 @@ pub struct Config {
220226
pub listening_address: Option<NetAddress>,
221227
/// The default CLTV expiry delta to be used for payments.
222228
pub default_cltv_expiry_delta: u32,
229+
/// The time in-between background sync attempts of the onchain wallet, in seconds.
230+
///
231+
/// **Note:** A minimum of 10 seconds is always enforced.
232+
pub onchain_wallet_sync_interval_secs: u64,
233+
/// The time in-between background sync attempts of the LDK wallet, in seconds.
234+
///
235+
/// **Note:** A minimum of 10 seconds is always enforced.
236+
pub wallet_sync_interval_secs: u64,
223237
/// The level at which we log messages.
224238
///
225239
/// Any messages below this level will be excluded from the logs.
@@ -233,6 +247,8 @@ impl Default for Config {
233247
network: DEFAULT_NETWORK,
234248
listening_address: Some(DEFAULT_LISTENING_ADDR.parse().unwrap()),
235249
default_cltv_expiry_delta: DEFAULT_CLTV_EXPIRY_DELTA,
250+
onchain_wallet_sync_interval_secs: DEFAULT_BDK_WALLET_SYNC_INTERVAL_SECS,
251+
wallet_sync_interval_secs: DEFAULT_LDK_WALLET_SYNC_INTERVAL_SECS,
236252
log_level: DEFAULT_LOG_LEVEL,
237253
}
238254
}
@@ -766,40 +782,29 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
766782

767783
let runtime = tokio::runtime::Builder::new_multi_thread().enable_all().build().unwrap();
768784

769-
let event_handler = Arc::new(EventHandler::new(
770-
Arc::clone(&self.wallet),
771-
Arc::clone(&self.event_queue),
772-
Arc::clone(&self.channel_manager),
773-
Arc::clone(&self.network_graph),
774-
Arc::clone(&self.keys_manager),
775-
Arc::clone(&self.payment_store),
776-
Arc::clone(&self.runtime),
777-
Arc::clone(&self.logger),
778-
Arc::clone(&self.config),
779-
));
780-
781785
// Setup wallet sync
782786
let wallet = Arc::clone(&self.wallet);
783-
let tx_sync = Arc::clone(&self.tx_sync);
784-
let sync_cman = Arc::clone(&self.channel_manager);
785-
let sync_cmon = Arc::clone(&self.chain_monitor);
786787
let sync_logger = Arc::clone(&self.logger);
787788
let mut stop_sync = self.stop_receiver.clone();
788-
789+
let onchain_wallet_sync_interval_secs =
790+
self.config.onchain_wallet_sync_interval_secs.max(10);
789791
std::thread::spawn(move || {
790792
tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap().block_on(
791793
async move {
792-
let mut interval = tokio::time::interval(Duration::from_secs(30));
793-
interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
794+
let mut onchain_wallet_sync_interval = tokio::time::interval(
795+
Duration::from_secs(onchain_wallet_sync_interval_secs),
796+
);
797+
onchain_wallet_sync_interval
798+
.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
794799
loop {
795800
let now = Instant::now();
796801
tokio::select! {
797802
_ = stop_sync.changed() => {
798803
return;
799804
}
800-
_ = interval.tick() => {
805+
_ = onchain_wallet_sync_interval.tick() => {
801806
match wallet.sync().await {
802-
Ok(()) => log_info!(
807+
Ok(()) => log_trace!(
803808
sync_logger,
804809
"Background sync of on-chain wallet finished in {}ms.",
805810
now.elapsed().as_millis()
@@ -819,6 +824,42 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
819824
);
820825
});
821826

827+
let tx_sync = Arc::clone(&self.tx_sync);
828+
let sync_cman = Arc::clone(&self.channel_manager);
829+
let sync_cmon = Arc::clone(&self.chain_monitor);
830+
let sync_logger = Arc::clone(&self.logger);
831+
let mut stop_sync = self.stop_receiver.clone();
832+
let wallet_sync_interval_secs = self.config.wallet_sync_interval_secs.max(10);
833+
runtime.spawn(async move {
834+
let mut wallet_sync_interval =
835+
tokio::time::interval(Duration::from_secs(wallet_sync_interval_secs));
836+
wallet_sync_interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
837+
loop {
838+
let now = Instant::now();
839+
tokio::select! {
840+
_ = stop_sync.changed() => {
841+
return;
842+
}
843+
_ = wallet_sync_interval.tick() => {
844+
let confirmables = vec![
845+
&*sync_cman as &(dyn Confirm + Sync + Send),
846+
&*sync_cmon as &(dyn Confirm + Sync + Send),
847+
];
848+
match tx_sync.sync(confirmables).await {
849+
Ok(()) => log_trace!(
850+
sync_logger,
851+
"Background sync of Lightning wallet finished in {}ms.",
852+
now.elapsed().as_millis()
853+
),
854+
Err(e) => {
855+
log_error!(sync_logger, "Background sync of Lightning wallet failed: {}", e)
856+
}
857+
}
858+
}
859+
}
860+
}
861+
});
862+
822863
if self.gossip_source.is_rgs() {
823864
let gossip_source = Arc::clone(&self.gossip_source);
824865
let gossip_sync_store = Arc::clone(&self.kv_store);
@@ -836,7 +877,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
836877
let now = Instant::now();
837878
match gossip_source.update_rgs_snapshot().await {
838879
Ok(updated_timestamp) => {
839-
log_info!(
880+
log_trace!(
840881
gossip_sync_logger,
841882
"Background sync of RGS gossip data finished in {}ms.",
842883
now.elapsed().as_millis()
@@ -860,37 +901,6 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
860901
});
861902
}
862903

863-
let sync_logger = Arc::clone(&self.logger);
864-
let mut stop_sync = self.stop_receiver.clone();
865-
runtime.spawn(async move {
866-
let mut interval = tokio::time::interval(Duration::from_secs(10));
867-
interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
868-
loop {
869-
let now = Instant::now();
870-
tokio::select! {
871-
_ = stop_sync.changed() => {
872-
return;
873-
}
874-
_ = interval.tick() => {
875-
let confirmables = vec![
876-
&*sync_cman as &(dyn Confirm + Sync + Send),
877-
&*sync_cmon as &(dyn Confirm + Sync + Send),
878-
];
879-
match tx_sync.sync(confirmables).await {
880-
Ok(()) => log_info!(
881-
sync_logger,
882-
"Background sync of Lightning wallet finished in {}ms.",
883-
now.elapsed().as_millis()
884-
),
885-
Err(e) => {
886-
log_error!(sync_logger, "Background sync of Lightning wallet failed: {}", e)
887-
}
888-
}
889-
}
890-
}
891-
}
892-
});
893-
894904
if let Some(listening_address) = &self.config.listening_address {
895905
// Setup networking
896906
let peer_manager_connection_handler = Arc::clone(&self.peer_manager);
@@ -1024,6 +1034,18 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
10241034
}
10251035
});
10261036

1037+
let event_handler = Arc::new(EventHandler::new(
1038+
Arc::clone(&self.wallet),
1039+
Arc::clone(&self.event_queue),
1040+
Arc::clone(&self.channel_manager),
1041+
Arc::clone(&self.network_graph),
1042+
Arc::clone(&self.keys_manager),
1043+
Arc::clone(&self.payment_store),
1044+
Arc::clone(&self.runtime),
1045+
Arc::clone(&self.logger),
1046+
Arc::clone(&self.config),
1047+
));
1048+
10271049
// Setup background processing
10281050
let background_persister = Arc::clone(&self.kv_store);
10291051
let background_event_handler = Arc::clone(&event_handler);

0 commit comments

Comments
 (0)