@@ -112,102 +112,104 @@ impl EsploraChainSource {
112
112
} ) ?;
113
113
}
114
114
115
- let res = {
116
- // If this is our first sync, do a full scan with the configured gap limit.
117
- // Otherwise just do an incremental sync.
118
- let incremental_sync =
119
- self . node_metrics . read ( ) . unwrap ( ) . latest_onchain_wallet_sync_timestamp . is_some ( ) ;
120
-
121
- macro_rules! get_and_apply_wallet_update {
122
- ( $sync_future: expr) => { {
123
- let now = Instant :: now( ) ;
124
- match $sync_future. await {
125
- Ok ( res) => match res {
126
- Ok ( update) => match self . onchain_wallet. apply_update( update) {
127
- Ok ( ( ) ) => {
128
- log_info!(
129
- self . logger,
130
- "{} of on-chain wallet finished in {}ms." ,
131
- if incremental_sync { "Incremental sync" } else { "Sync" } ,
132
- now. elapsed( ) . as_millis( )
133
- ) ;
134
- let unix_time_secs_opt = SystemTime :: now( )
135
- . duration_since( UNIX_EPOCH )
136
- . ok( )
137
- . map( |d| d. as_secs( ) ) ;
138
- {
139
- let mut locked_node_metrics = self . node_metrics. write( ) . unwrap( ) ;
140
- locked_node_metrics. latest_onchain_wallet_sync_timestamp = unix_time_secs_opt;
141
- write_node_metrics(
142
- & * locked_node_metrics,
143
- Arc :: clone( & self . kv_store) ,
144
- Arc :: clone( & self . logger)
145
- ) ?;
146
- }
147
- Ok ( ( ) )
148
- } ,
149
- Err ( e) => Err ( e) ,
150
- } ,
151
- Err ( e) => match * e {
152
- esplora_client:: Error :: Reqwest ( he) => {
153
- log_error!(
154
- self . logger,
155
- "{} of on-chain wallet failed due to HTTP connection error: {}" ,
156
- if incremental_sync { "Incremental sync" } else { "Sync" } ,
157
- he
158
- ) ;
159
- Err ( Error :: WalletOperationFailed )
160
- } ,
161
- _ => {
162
- log_error!(
163
- self . logger,
164
- "{} of on-chain wallet failed due to Esplora error: {}" ,
165
- if incremental_sync { "Incremental sync" } else { "Sync" } ,
166
- e
167
- ) ;
168
- Err ( Error :: WalletOperationFailed )
169
- } ,
170
- } ,
171
- } ,
172
- Err ( e) => {
173
- log_error!(
174
- self . logger,
175
- "{} of on-chain wallet timed out: {}" ,
176
- if incremental_sync { "Incremental sync" } else { "Sync" } ,
177
- e
178
- ) ;
179
- Err ( Error :: WalletOperationTimeout )
180
- } ,
181
- }
182
- } }
183
- }
184
-
185
- if incremental_sync {
186
- let sync_request = self . onchain_wallet . get_incremental_sync_request ( ) ;
187
- let wallet_sync_timeout_fut = tokio:: time:: timeout (
188
- Duration :: from_secs ( BDK_WALLET_SYNC_TIMEOUT_SECS ) ,
189
- self . esplora_client . sync ( sync_request, BDK_CLIENT_CONCURRENCY ) ,
190
- ) ;
191
- get_and_apply_wallet_update ! ( wallet_sync_timeout_fut)
192
- } else {
193
- let full_scan_request = self . onchain_wallet . get_full_scan_request ( ) ;
194
- let wallet_sync_timeout_fut = tokio:: time:: timeout (
195
- Duration :: from_secs ( BDK_WALLET_SYNC_TIMEOUT_SECS ) ,
196
- self . esplora_client . full_scan (
197
- full_scan_request,
198
- BDK_CLIENT_STOP_GAP ,
199
- BDK_CLIENT_CONCURRENCY ,
200
- ) ,
201
- ) ;
202
- get_and_apply_wallet_update ! ( wallet_sync_timeout_fut)
203
- }
204
- } ;
115
+ let res = self . sync_onchain_wallet_inner ( ) . await ;
205
116
206
117
self . onchain_wallet_sync_status . lock ( ) . unwrap ( ) . propagate_result_to_subscribers ( res) ;
207
118
208
119
res
209
120
}
210
121
122
+ async fn sync_onchain_wallet_inner ( & self ) -> Result < ( ) , Error > {
123
+ // If this is our first sync, do a full scan with the configured gap limit.
124
+ // Otherwise just do an incremental sync.
125
+ let incremental_sync =
126
+ self . node_metrics . read ( ) . unwrap ( ) . latest_onchain_wallet_sync_timestamp . is_some ( ) ;
127
+
128
+ macro_rules! get_and_apply_wallet_update {
129
+ ( $sync_future: expr) => { {
130
+ let now = Instant :: now( ) ;
131
+ match $sync_future. await {
132
+ Ok ( res) => match res {
133
+ Ok ( update) => match self . onchain_wallet. apply_update( update) {
134
+ Ok ( ( ) ) => {
135
+ log_info!(
136
+ self . logger,
137
+ "{} of on-chain wallet finished in {}ms." ,
138
+ if incremental_sync { "Incremental sync" } else { "Sync" } ,
139
+ now. elapsed( ) . as_millis( )
140
+ ) ;
141
+ let unix_time_secs_opt = SystemTime :: now( )
142
+ . duration_since( UNIX_EPOCH )
143
+ . ok( )
144
+ . map( |d| d. as_secs( ) ) ;
145
+ {
146
+ let mut locked_node_metrics = self . node_metrics. write( ) . unwrap( ) ;
147
+ locked_node_metrics. latest_onchain_wallet_sync_timestamp = unix_time_secs_opt;
148
+ write_node_metrics(
149
+ & * locked_node_metrics,
150
+ Arc :: clone( & self . kv_store) ,
151
+ Arc :: clone( & self . logger)
152
+ ) ?;
153
+ }
154
+ Ok ( ( ) )
155
+ } ,
156
+ Err ( e) => Err ( e) ,
157
+ } ,
158
+ Err ( e) => match * e {
159
+ esplora_client:: Error :: Reqwest ( he) => {
160
+ log_error!(
161
+ self . logger,
162
+ "{} of on-chain wallet failed due to HTTP connection error: {}" ,
163
+ if incremental_sync { "Incremental sync" } else { "Sync" } ,
164
+ he
165
+ ) ;
166
+ Err ( Error :: WalletOperationFailed )
167
+ } ,
168
+ _ => {
169
+ log_error!(
170
+ self . logger,
171
+ "{} of on-chain wallet failed due to Esplora error: {}" ,
172
+ if incremental_sync { "Incremental sync" } else { "Sync" } ,
173
+ e
174
+ ) ;
175
+ Err ( Error :: WalletOperationFailed )
176
+ } ,
177
+ } ,
178
+ } ,
179
+ Err ( e) => {
180
+ log_error!(
181
+ self . logger,
182
+ "{} of on-chain wallet timed out: {}" ,
183
+ if incremental_sync { "Incremental sync" } else { "Sync" } ,
184
+ e
185
+ ) ;
186
+ Err ( Error :: WalletOperationTimeout )
187
+ } ,
188
+ }
189
+ } }
190
+ }
191
+
192
+ if incremental_sync {
193
+ let sync_request = self . onchain_wallet . get_incremental_sync_request ( ) ;
194
+ let wallet_sync_timeout_fut = tokio:: time:: timeout (
195
+ Duration :: from_secs ( BDK_WALLET_SYNC_TIMEOUT_SECS ) ,
196
+ self . esplora_client . sync ( sync_request, BDK_CLIENT_CONCURRENCY ) ,
197
+ ) ;
198
+ get_and_apply_wallet_update ! ( wallet_sync_timeout_fut)
199
+ } else {
200
+ let full_scan_request = self . onchain_wallet . get_full_scan_request ( ) ;
201
+ let wallet_sync_timeout_fut = tokio:: time:: timeout (
202
+ Duration :: from_secs ( BDK_WALLET_SYNC_TIMEOUT_SECS ) ,
203
+ self . esplora_client . full_scan (
204
+ full_scan_request,
205
+ BDK_CLIENT_STOP_GAP ,
206
+ BDK_CLIENT_CONCURRENCY ,
207
+ ) ,
208
+ ) ;
209
+ get_and_apply_wallet_update ! ( wallet_sync_timeout_fut)
210
+ }
211
+ }
212
+
211
213
pub ( super ) async fn sync_lightning_wallet (
212
214
& self , channel_manager : Arc < ChannelManager > , chain_monitor : Arc < ChainMonitor > ,
213
215
output_sweeper : Arc < Sweeper > ,
0 commit comments