Skip to content

Commit 1983ea6

Browse files
committed
fix (backend): separate retry policies for sequencer and rpc endpoint
1 parent 462fcea commit 1983ea6

4 files changed

Lines changed: 49 additions & 31 deletions

File tree

backend/src/configs/network.rs

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ use super::env::EnvVarParser;
55
/// Default network status refetch interval in seconds
66
const DEFAULT_NETWORK_STATUS_REFETCH_INTERVAL_S: u64 = 10;
77

8+
/// Default retry policy max retries
9+
const DEFAULT_RETRY_POLICY_MAX_RETRIES: u64 = 5;
10+
11+
/// Default retry policy total retry time
12+
const DEFAULT_RETRY_POLICY_TOTAL_RETRY_TIME: u64 = 60;
13+
14+
/// Default retry policy base
15+
const DEFAULT_RETRY_POLICY_BASE: f64 = 1.5;
16+
817
#[derive(Debug, Clone)]
918
pub(crate) struct NetworkConfig {
1019
/// JSON-RPC Endpoint for Strata sequencer
@@ -16,11 +25,11 @@ pub(crate) struct NetworkConfig {
1625
/// Bundler health check URL (overrides `.env`)
1726
bundler_url: String,
1827

19-
/// Max retries in querying status
20-
max_retries: u64,
28+
/// Max retries for status queries
29+
retry_policy_max_retries: u64,
2130

22-
/// Total time in seconds to spend retrying
23-
total_retry_time: u64,
31+
/// Total time in seconds to spend retrying status queries
32+
retry_policy_total_time_s: u64,
2433

2534
/// Network status refetch interval in seconds
2635
status_refetch_interval_s: u64,
@@ -37,9 +46,10 @@ impl NetworkConfig {
3746
let bundler_url = String::parse_env_var("BUNDLER_URL")
3847
.unwrap_or_else(|| "http://localhost:8434".to_string());
3948

40-
let max_retries = u64::parse_env_var("MAX_STATUS_RETRIES").unwrap_or(5);
41-
42-
let total_retry_time = u64::parse_env_var("TOTAL_RETRY_TIME").unwrap_or(60);
49+
let retry_policy_max_retries = u64::parse_env_var("NETWORK_STATUS_MAX_RETRIES")
50+
.unwrap_or(DEFAULT_RETRY_POLICY_MAX_RETRIES);
51+
let retry_policy_total_time_s = u64::parse_env_var("NETWORK_STATUS_TOTAL_RETRY_TIME_S")
52+
.unwrap_or(DEFAULT_RETRY_POLICY_TOTAL_RETRY_TIME);
4353

4454
let status_refetch_interval_s = u64::parse_env_var("NETWORK_STATUS_REFETCH_INTERVAL_S")
4555
.unwrap_or(DEFAULT_NETWORK_STATUS_REFETCH_INTERVAL_S);
@@ -50,8 +60,8 @@ impl NetworkConfig {
5060
sequencer_url,
5161
rpc_url,
5262
bundler_url,
53-
max_retries,
54-
total_retry_time,
63+
retry_policy_max_retries,
64+
retry_policy_total_time_s,
5565
status_refetch_interval_s,
5666
}
5767
}
@@ -71,18 +81,26 @@ impl NetworkConfig {
7181
&self.bundler_url
7282
}
7383

74-
/// Getter for `max_retries`
75-
pub(crate) fn max_retries(&self) -> u64 {
76-
self.max_retries
84+
/// Getter for `status_refetch_interval_s`
85+
pub(crate) fn status_refetch_interval(&self) -> u64 {
86+
self.status_refetch_interval_s
7787
}
7888

79-
/// Getter for `total_retry_time`
80-
pub(crate) fn total_retry_time(&self) -> u64 {
81-
self.total_retry_time
89+
/// Retry policy for sequencer status queries
90+
pub(crate) fn sequencer_retry_policy(&self) -> crate::utils::retry_policy::ExponentialBackoff {
91+
crate::utils::retry_policy::ExponentialBackoff::new(
92+
self.retry_policy_max_retries,
93+
self.retry_policy_total_time_s,
94+
DEFAULT_RETRY_POLICY_BASE,
95+
)
8296
}
8397

84-
/// Getter for `status_refetch_interval_s`
85-
pub(crate) fn status_refetch_interval(&self) -> u64 {
86-
self.status_refetch_interval_s
98+
/// Retry policy for RPC endpoint status queries
99+
pub(crate) fn rpc_retry_policy(&self) -> crate::utils::retry_policy::ExponentialBackoff {
100+
crate::utils::retry_policy::ExponentialBackoff::new(
101+
self.retry_policy_max_retries,
102+
self.retry_policy_total_time_s,
103+
DEFAULT_RETRY_POLICY_BASE,
104+
)
87105
}
88106
}

backend/src/network/status.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ use crate::{
1212
};
1313

1414
/// Calls `strata_syncStatus` using `jsonrpsee`
15-
async fn call_rpc_status(
16-
config: &NetworkConfig,
17-
client: &HttpClient,
18-
retry_policy: ExponentialBackoff,
19-
) -> Status {
15+
async fn call_rpc_status(client: &HttpClient, retry_policy: ExponentialBackoff) -> Status {
2016
let mut retry_count: u64 = 0;
2117

2218
loop {
@@ -32,7 +28,7 @@ async fn call_rpc_status(
3228
}
3329
}
3430
Err(e) => {
35-
if retry_count < config.max_retries() {
31+
if retry_count < retry_policy.max_retries() {
3632
let delay_seconds = retry_policy.get_delay(retry_count);
3733
if delay_seconds > 0 {
3834
info!(?delay_seconds, "Retrying `strata_syncStatus` after");
@@ -69,17 +65,13 @@ pub(crate) async fn fetch_statuses_task(context: Arc<NetworkMonitoringContext>)
6965
let sequencer_client = create_rpc_client(context.config.sequencer_url());
7066
let rpc_client = create_rpc_client(context.config.rpc_url());
7167
let http_client = reqwest::Client::new();
72-
let retry_policy = ExponentialBackoff::new(
73-
context.config.max_retries(),
74-
context.config.total_retry_time(),
75-
1.5,
76-
);
7768

7869
loop {
7970
interval.tick().await;
8071

81-
let sequencer = call_rpc_status(&context.config, &sequencer_client, retry_policy).await;
82-
let rpc_endpoint = call_rpc_status(&context.config, &rpc_client, retry_policy).await;
72+
let sequencer =
73+
call_rpc_status(&sequencer_client, context.config.sequencer_retry_policy()).await;
74+
let rpc_endpoint = call_rpc_status(&rpc_client, context.config.rpc_retry_policy()).await;
8375
let bundler_endpoint = check_bundler_health(&http_client, &context.config).await;
8476

8577
let new_status = NetworkStatus {

backend/src/utils/retry_policy.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ impl ExponentialBackoff {
2020
}
2121
}
2222

23+
/// Returns the maximum number of retries.
24+
pub fn max_retries(&self) -> u64 {
25+
self.max_retries
26+
}
27+
2328
/// Returns the delay in seconds.
2429
pub fn get_delay(&self, retry_counter: u64) -> u64 {
2530
if retry_counter == 0 {

docker-compose.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ services:
88
RUST_LOG: INFO
99
STRATA_SEQUENCER_URL: https://strataseq.testnet.alpenlabs.io
1010
RPC_URL: https://rpc.testnet.alpenlabs.io
11+
NETWORK_STATUS_MAX_RETRIES: 5
12+
NETWORK_STATUS_TOTAL_RETRY_TIME_S: 60
13+
NETWORK_STATUS_REFETCH_INTERVAL_S: 10
1114
STRATA_BRIDGE_OPERATORS_COUNT: 4
1215
STRATA_BRIDGE_1_RPC_URL: https://bridge.testnet.alpenlabs.io/1
1316
STRATA_BRIDGE_1_PUBLIC_KEY: 0273441f2ba801b557b23c15829f4a87c02332d59a71499da1479048e6175ff4e0

0 commit comments

Comments
 (0)