@@ -36,7 +36,7 @@ use lightning_transaction_sync::EsploraSyncClient;
36
36
use lightning_block_sync:: gossip:: UtxoSource ;
37
37
use lightning_block_sync:: init:: { synchronize_listeners, validate_best_block_header} ;
38
38
use lightning_block_sync:: poll:: { ChainPoller , ChainTip , ValidatedBlockHeader } ;
39
- use lightning_block_sync:: SpvClient ;
39
+ use lightning_block_sync:: { BlockSourceErrorKind , SpvClient } ;
40
40
41
41
use bdk_esplora:: EsploraAsyncExt ;
42
42
use bdk_wallet:: Update as BdkUpdate ;
@@ -425,6 +425,9 @@ impl ChainSource {
425
425
"Starting initial synchronization of chain listeners. This might take a while.." ,
426
426
) ;
427
427
428
+ let mut backoff = CHAIN_POLLING_INTERVAL_SECS ;
429
+ const MAX_BACKOFF_SECS : u64 = 300 ;
430
+
428
431
loop {
429
432
let channel_manager_best_block_hash =
430
433
channel_manager. current_best_block ( ) . block_hash ;
@@ -504,8 +507,24 @@ impl ChainSource {
504
507
505
508
Err ( e) => {
506
509
log_error ! ( logger, "Failed to synchronize chain listeners: {:?}" , e) ;
507
- tokio:: time:: sleep ( Duration :: from_secs ( CHAIN_POLLING_INTERVAL_SECS ) )
508
- . await ;
510
+ if e. kind ( ) == BlockSourceErrorKind :: Transient {
511
+ log_info ! (
512
+ logger,
513
+ "Transient error syncing chain listeners: {:?}. Retrying in {} seconds." ,
514
+ e,
515
+ backoff
516
+ ) ;
517
+ tokio:: time:: sleep ( Duration :: from_secs ( backoff) ) . await ;
518
+ backoff = std:: cmp:: min ( backoff * 2 , MAX_BACKOFF_SECS ) ;
519
+ } else {
520
+ log_error ! (
521
+ logger,
522
+ "Persistent error syncing chain listeners: {:?}. Retrying in {} seconds." ,
523
+ e,
524
+ MAX_BACKOFF_SECS
525
+ ) ;
526
+ tokio:: time:: sleep ( Duration :: from_secs ( MAX_BACKOFF_SECS ) ) . await ;
527
+ }
509
528
} ,
510
529
}
511
530
}
0 commit comments