Skip to content

Commit 4801859

Browse files
feat(fortuna): add delayed processing for backup replicas
- Add configurable time delay before backup replicas check request status - Backup replicas now wait backup_delay_seconds before attempting fulfillment - Add backup_delay_seconds field to ReplicaConfig with default of 30 seconds - Improves reliability by reducing race conditions between replicas Co-Authored-By: Tejas Badadare <[email protected]>
1 parent a66fe6e commit 4801859

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

apps/fortuna/src/config.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,12 @@ fn default_chain_sample_interval() -> u64 {
346346
pub struct ReplicaConfig {
347347
pub replica_id: u64,
348348
pub total_replicas: u64,
349+
#[serde(default = "default_backup_delay_seconds")]
350+
pub backup_delay_seconds: u64,
351+
}
352+
353+
fn default_backup_delay_seconds() -> u64 {
354+
30
349355
}
350356

351357
/// Configuration values for the keeper service that are shared across chains.

apps/fortuna/src/keeper/process_event.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ pub async fn process_event_with_backoff(
5454
};
5555

5656
if !is_primary_replica {
57+
if let Some(replica_config) = &process_param.keeper_config.replica_config {
58+
tracing::info!(
59+
sequence_number = event.sequence_number,
60+
delay_seconds = replica_config.backup_delay_seconds,
61+
"Waiting before processing as backup replica"
62+
);
63+
tokio::time::sleep(tokio::time::Duration::from_secs(
64+
replica_config.backup_delay_seconds,
65+
))
66+
.await;
67+
}
68+
5769
match chain_state
5870
.contract
5971
.get_request(event.provider_address, event.sequence_number)
@@ -62,21 +74,21 @@ pub async fn process_event_with_backoff(
6274
Ok(Some(_)) => {
6375
tracing::info!(
6476
sequence_number = event.sequence_number,
65-
"Request still open, processing as backup replica"
77+
"Request still open after delay, processing as backup replica"
6678
);
6779
}
6880
Ok(None) => {
6981
tracing::debug!(
7082
sequence_number = event.sequence_number,
71-
"Request already fulfilled by primary replica, skipping"
83+
"Request already fulfilled by primary replica during delay, skipping"
7284
);
7385
return Ok(());
7486
}
7587
Err(e) => {
7688
tracing::warn!(
7789
sequence_number = event.sequence_number,
7890
error = ?e,
79-
"Error checking request status, skipping"
91+
"Error checking request status after delay, skipping"
8092
);
8193
return Ok(());
8294
}

0 commit comments

Comments
 (0)