@@ -26,6 +26,7 @@ use bitcoin::{Script, Transaction, TxOut};
26
26
27
27
use std:: collections:: HashMap ;
28
28
use std:: sync:: { Arc , Condvar , Mutex , RwLock } ;
29
+ use std:: time:: Duration ;
29
30
30
31
pub struct Wallet < D >
31
32
where
@@ -79,12 +80,34 @@ where
79
80
}
80
81
81
82
let sync_options = SyncOptions { progress : None } ;
82
- let res = match self . inner . lock ( ) . unwrap ( ) . sync ( & self . blockchain , sync_options) . await {
83
+ let wallet_lock = self . inner . lock ( ) . unwrap ( ) ;
84
+ let res = match wallet_lock. sync ( & self . blockchain , sync_options) . await {
83
85
Ok ( ( ) ) => Ok ( ( ) ) ,
84
- Err ( e) => {
85
- log_error ! ( self . logger, "Wallet sync error: {}" , e) ;
86
- Err ( From :: from ( e) )
87
- }
86
+ Err ( e) => match e {
87
+ bdk:: Error :: Esplora ( ref be) => match * * be {
88
+ bdk:: blockchain:: esplora:: EsploraError :: Reqwest ( _) => {
89
+ tokio:: time:: sleep ( Duration :: from_secs ( 1 ) ) . await ;
90
+ log_error ! (
91
+ self . logger,
92
+ "Sync failed due to HTTP connection error, retrying: {}" ,
93
+ e
94
+ ) ;
95
+ let sync_options = SyncOptions { progress : None } ;
96
+ wallet_lock
97
+ . sync ( & self . blockchain , sync_options)
98
+ . await
99
+ . map_err ( |e| From :: from ( e) )
100
+ }
101
+ _ => {
102
+ log_error ! ( self . logger, "Sync failed due to Esplora error: {}" , e) ;
103
+ Err ( From :: from ( e) )
104
+ }
105
+ } ,
106
+ _ => {
107
+ log_error ! ( self . logger, "Wallet sync error: {}" , e) ;
108
+ Err ( From :: from ( e) )
109
+ }
110
+ } ,
88
111
} ;
89
112
90
113
drop ( guard) ;
0 commit comments