Skip to content

Commit fb34a27

Browse files
committed
Move inner code to sync_lightning_wallet_inner for Esplora
Previously, we might have overlooked some cases that would exit the method and bubble up an error via `?` instead of propagating to all subscribers. Here, we split out the code to an inner method to ensure we always propagate.
1 parent 0935401 commit fb34a27

File tree

1 file changed

+61
-54
lines changed

1 file changed

+61
-54
lines changed

src/chain/esplora.rs

Lines changed: 61 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,6 @@ impl EsploraChainSource {
212212
&self, channel_manager: Arc<ChannelManager>, chain_monitor: Arc<ChainMonitor>,
213213
output_sweeper: Arc<Sweeper>,
214214
) -> Result<(), Error> {
215-
let sync_cman = Arc::clone(&channel_manager);
216-
let sync_cmon = Arc::clone(&chain_monitor);
217-
let sync_sweeper = Arc::clone(&output_sweeper);
218-
let confirmables = vec![
219-
&*sync_cman as &(dyn Confirm + Sync + Send),
220-
&*sync_cmon as &(dyn Confirm + Sync + Send),
221-
&*sync_sweeper as &(dyn Confirm + Sync + Send),
222-
];
223-
224215
let receiver_res = {
225216
let mut status_lock = self.lightning_wallet_sync_status.lock().unwrap();
226217
status_lock.register_or_subscribe_pending_sync()
@@ -233,58 +224,74 @@ impl EsploraChainSource {
233224
Error::WalletOperationFailed
234225
})?;
235226
}
236-
let res = {
237-
let timeout_fut = tokio::time::timeout(
238-
Duration::from_secs(LDK_WALLET_SYNC_TIMEOUT_SECS),
239-
self.tx_sync.sync(confirmables),
240-
);
241-
let now = Instant::now();
242-
match timeout_fut.await {
243-
Ok(res) => match res {
244-
Ok(()) => {
245-
log_info!(
246-
self.logger,
247-
"Sync of Lightning wallet finished in {}ms.",
248-
now.elapsed().as_millis()
249-
);
250227

251-
let unix_time_secs_opt =
252-
SystemTime::now().duration_since(UNIX_EPOCH).ok().map(|d| d.as_secs());
253-
{
254-
let mut locked_node_metrics = self.node_metrics.write().unwrap();
255-
locked_node_metrics.latest_lightning_wallet_sync_timestamp =
256-
unix_time_secs_opt;
257-
write_node_metrics(
258-
&*locked_node_metrics,
259-
Arc::clone(&self.kv_store),
260-
Arc::clone(&self.logger),
261-
)?;
262-
}
263-
264-
periodically_archive_fully_resolved_monitors(
265-
Arc::clone(&channel_manager),
266-
Arc::clone(&chain_monitor),
228+
let res =
229+
self.sync_lightning_wallet_inner(channel_manager, chain_monitor, output_sweeper).await;
230+
231+
self.lightning_wallet_sync_status.lock().unwrap().propagate_result_to_subscribers(res);
232+
233+
res
234+
}
235+
236+
async fn sync_lightning_wallet_inner(
237+
&self, channel_manager: Arc<ChannelManager>, chain_monitor: Arc<ChainMonitor>,
238+
output_sweeper: Arc<Sweeper>,
239+
) -> Result<(), Error> {
240+
let sync_cman = Arc::clone(&channel_manager);
241+
let sync_cmon = Arc::clone(&chain_monitor);
242+
let sync_sweeper = Arc::clone(&output_sweeper);
243+
let confirmables = vec![
244+
&*sync_cman as &(dyn Confirm + Sync + Send),
245+
&*sync_cmon as &(dyn Confirm + Sync + Send),
246+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
247+
];
248+
249+
let timeout_fut = tokio::time::timeout(
250+
Duration::from_secs(LDK_WALLET_SYNC_TIMEOUT_SECS),
251+
self.tx_sync.sync(confirmables),
252+
);
253+
let now = Instant::now();
254+
match timeout_fut.await {
255+
Ok(res) => match res {
256+
Ok(()) => {
257+
log_info!(
258+
self.logger,
259+
"Sync of Lightning wallet finished in {}ms.",
260+
now.elapsed().as_millis()
261+
);
262+
263+
let unix_time_secs_opt =
264+
SystemTime::now().duration_since(UNIX_EPOCH).ok().map(|d| d.as_secs());
265+
{
266+
let mut locked_node_metrics = self.node_metrics.write().unwrap();
267+
locked_node_metrics.latest_lightning_wallet_sync_timestamp =
268+
unix_time_secs_opt;
269+
write_node_metrics(
270+
&*locked_node_metrics,
267271
Arc::clone(&self.kv_store),
268272
Arc::clone(&self.logger),
269-
Arc::clone(&self.node_metrics),
270273
)?;
271-
Ok(())
272-
},
273-
Err(e) => {
274-
log_error!(self.logger, "Sync of Lightning wallet failed: {}", e);
275-
Err(e.into())
276-
},
274+
}
275+
276+
periodically_archive_fully_resolved_monitors(
277+
Arc::clone(&channel_manager),
278+
Arc::clone(&chain_monitor),
279+
Arc::clone(&self.kv_store),
280+
Arc::clone(&self.logger),
281+
Arc::clone(&self.node_metrics),
282+
)?;
283+
Ok(())
277284
},
278285
Err(e) => {
279-
log_error!(self.logger, "Lightning wallet sync timed out: {}", e);
280-
Err(Error::TxSyncTimeout)
286+
log_error!(self.logger, "Sync of Lightning wallet failed: {}", e);
287+
Err(e.into())
281288
},
282-
}
283-
};
284-
285-
self.lightning_wallet_sync_status.lock().unwrap().propagate_result_to_subscribers(res);
286-
287-
res
289+
},
290+
Err(e) => {
291+
log_error!(self.logger, "Lightning wallet sync timed out: {}", e);
292+
Err(Error::TxSyncTimeout)
293+
},
294+
}
288295
}
289296

290297
pub(crate) async fn update_fee_rate_estimates(&self) -> Result<(), Error> {

0 commit comments

Comments
 (0)