From 1544efc0e261271be4cb7dfd337bf9b3dac1878a Mon Sep 17 00:00:00 2001 From: Fraser Hutchison <190532+Fraser999@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:29:27 +0000 Subject: [PATCH] fix: retry fetching the host block header --- Cargo.lock | 16 +++++++++++++++- Cargo.toml | 7 ++++--- src/tasks/env.rs | 25 ++++++++++++++++++++----- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8626646..7e3e842c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2029,6 +2029,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" dependencies = [ "fastrand", + "gloo-timers 0.3.0", "tokio", ] @@ -2422,6 +2423,7 @@ dependencies = [ "alloy-chains", "alloy-hardforks 0.4.7", "axum 0.7.9", + "backon", "eyre", "futures-util", "init4-bin-base", @@ -4097,7 +4099,7 @@ version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" dependencies = [ - "gloo-timers", + "gloo-timers 0.2.6", "send_wrapper 0.4.0", ] @@ -4237,6 +4239,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "gloo-utils" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 7f68b17c..9698d261 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,16 +47,17 @@ alloy = { version = "1.4.0", features = [ reth-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.11.0" } axum = "0.7.5" +backon = { version = "1.6.0", features = ["tokio-sleep"] } eyre = "0.6.12" +futures-util = "0.3.31" openssl = { version = "0.10", features = ["vendored"] } reqwest = { version = "0.12.22", features = ["blocking", "json"] } serde = { version = "1.0.197", features = ["derive"] } -tracing = "0.1.41" +thiserror = "2.0.17" tokio = { version = "1.36.0", features = ["full", "macros", "rt-multi-thread"] } tokio-stream = "0.1.17" +tracing = "0.1.41" url = "2.5.4" -thiserror = "2.0.17" -futures-util = "0.3.31" [dev-dependencies] alloy-hardforks = "0.4.0" diff --git a/src/tasks/env.rs b/src/tasks/env.rs index b33939d6..e067785c 100644 --- a/src/tasks/env.rs +++ b/src/tasks/env.rs @@ -10,6 +10,8 @@ use alloy::{ primitives::{B256, U256}, providers::{Provider, network::Network}, }; +use backon::{ExponentialBuilder, Retryable}; +use core::time::Duration; use init4_bin_base::deps::{ opentelemetry::trace::TraceContextExt, tracing_opentelemetry::OpenTelemetrySpanExt, }; @@ -305,10 +307,24 @@ impl EnvTask { // Ensure that we record the OpenTelemetry trace ID in the span. span.record("trace_id", span.context().span().span_context().trace_id().to_string()); + let get_host_block_header = || { + let provider = self.host_provider.clone(); + async move { provider.get_header_by_number(host_block_number.into()).await } + }; + let backoff = ExponentialBuilder::default() + .with_factor(2.0) + .with_min_delay(Duration::from_millis(50)) + .with_max_times(4); let (host_block_res, quincey_res) = tokio::join!( - self.host_provider - .get_block_by_number(host_block_number.into()) - .into_future() + get_host_block_header + .retry(backoff) + .notify(|error, duration| { + tracing::warn!( + ?error, + retry_in_ms = duration.as_millis(), + "host block fetch failed, retrying" + ); + }) .instrument( debug_span!(parent: &span, "EnvTask::fetch_host_block").or_current() ), @@ -346,8 +362,7 @@ impl EnvTask { host_block_opt, span, warn!("previous host block not found - skipping block construction") - ) - .header; + ); span.record("confirmed.host.hash", host_header.hash.to_string());