@@ -16,7 +16,7 @@ use async_trait::async_trait;
16
16
use futures03:: StreamExt ;
17
17
use http0:: uri:: { Scheme , Uri } ;
18
18
use itertools:: Itertools ;
19
- use slog:: { error, info, Logger } ;
19
+ use slog:: { error, info, trace , Logger } ;
20
20
use std:: { collections:: HashMap , fmt:: Display , ops:: ControlFlow , sync:: Arc , time:: Duration } ;
21
21
use tokio:: sync:: OnceCell ;
22
22
use tonic:: codegen:: InterceptedService ;
@@ -33,6 +33,7 @@ use crate::components::network_provider::NetworkDetails;
33
33
use crate :: components:: network_provider:: ProviderCheckStrategy ;
34
34
use crate :: components:: network_provider:: ProviderManager ;
35
35
use crate :: components:: network_provider:: ProviderName ;
36
+ use crate :: prelude:: retry;
36
37
37
38
/// This is constant because we found this magic number of connections after
38
39
/// which the grpc connections start to hang.
@@ -425,7 +426,7 @@ impl FirehoseEndpoint {
425
426
}
426
427
427
428
pub async fn load_blocks_by_numbers < M > (
428
- & self ,
429
+ self : Arc < Self > ,
429
430
numbers : Vec < u64 > ,
430
431
logger : & Logger ,
431
432
) -> Result < Vec < M > , anyhow:: Error >
@@ -435,21 +436,39 @@ impl FirehoseEndpoint {
435
436
let mut blocks = Vec :: with_capacity ( numbers. len ( ) ) ;
436
437
437
438
for number in numbers {
438
- debug ! (
439
+ let provider_name = self . provider . as_str ( ) ;
440
+
441
+ trace ! (
439
442
logger,
440
443
"Loading block for block number {}" , number;
441
- "provider" => self . provider . as_str ( ) ,
444
+ "provider" => provider_name ,
442
445
) ;
443
446
444
- match self . get_block_by_number :: < M > ( number, logger) . await {
447
+ let retry_log_message = format ! ( "get_block_by_number for block {}" , number) ;
448
+ let endpoint_for_retry = self . cheap_clone ( ) ;
449
+
450
+ let logger_for_retry = logger. clone ( ) ;
451
+ let logger_for_error = logger. clone ( ) ;
452
+
453
+ let block = retry ( retry_log_message, & logger_for_retry)
454
+ . limit ( ENV_VARS . firehose_block_fetch_retry_limit )
455
+ . timeout_secs ( ENV_VARS . firehose_block_fetch_timeout )
456
+ . run ( move || {
457
+ let e = endpoint_for_retry. cheap_clone ( ) ;
458
+ let l = logger_for_retry. clone ( ) ;
459
+ async move { e. get_block_by_number :: < M > ( number, & l) . await }
460
+ } )
461
+ . await ;
462
+
463
+ match block {
445
464
Ok ( block) => {
446
465
blocks. push ( block) ;
447
466
}
448
467
Err ( e) => {
449
468
error ! (
450
- logger ,
469
+ logger_for_error ,
451
470
"Failed to load block number {}: {}" , number, e;
452
- "provider" => self . provider . as_str ( ) ,
471
+ "provider" => provider_name ,
453
472
) ;
454
473
return Err ( anyhow:: format_err!(
455
474
"failed to load block number {}: {}" ,
0 commit comments