From fe1dd9664a8480b12f84619a8085da4bb1adf6b1 Mon Sep 17 00:00:00 2001 From: dylan Date: Fri, 13 Jun 2025 17:33:11 -0600 Subject: [PATCH 1/4] fix: make retry attempts respect current slot number --- src/tasks/submit/task.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/tasks/submit/task.rs b/src/tasks/submit/task.rs index a93b013..a9ae6dd 100644 --- a/src/tasks/submit/task.rs +++ b/src/tasks/submit/task.rs @@ -130,9 +130,9 @@ impl SubmitTask { retry_limit: usize, ) -> eyre::Result { let submitting_start_time = Instant::now(); - - let (current_slot, start, end) = self.calculate_slot_window(); - debug!(current_slot, start, end, "calculating target slot window"); + let now = utils::now(); + let (initial_slot, start, end) = self.calculate_slot_window(); + debug!(initial_slot, start, end, now, "calculating target slot window"); let mut req = bumpable.req().clone(); @@ -147,6 +147,9 @@ impl SubmitTask { let inbound_result = match self.send_transaction(req).instrument(span.clone()).await { Ok(control_flow) => control_flow, Err(error) => { + if let Some(value) = self.slot_still_valid(initial_slot) { + return value; + } // Log error and retry error!(%error, "error handling inbound block"); ControlFlow::Retry @@ -157,6 +160,9 @@ impl SubmitTask { match inbound_result { ControlFlow::Retry => { + if let Some(value) = self.slot_still_valid(initial_slot) { + return value; + } // bump the req req = bumpable.bumped(); if bumpable.bump_count() > retry_limit { @@ -192,6 +198,19 @@ impl SubmitTask { Ok(result) } + /// Checks if a slot is still valid during submission retries. + fn slot_still_valid(&self, initial_slot: u64) -> Option> { + let (current_slot, _, _) = self.calculate_slot_window(); + if current_slot != initial_slot { + // If the slot has changed, skip the block + debug!(current_slot, initial_slot, "slot changed before submission - skipping block"); + counter!("builder.slot_missed").increment(1); + return Some(Ok(ControlFlow::Skip)); + } + debug!(current_slot, "slot still valid - continuing submission"); + None + } + /// Calculates and returns the slot number and its start and end timestamps for the current instant. fn calculate_slot_window(&self) -> (u64, u64, u64) { let now_ts = utils::now(); @@ -266,6 +285,12 @@ impl SubmitTask { { Ok(bumpable) => bumpable, Err(error) => { + if error.to_string().contains("403 Forbidden") { + // Don't error as this is expected behavior + warn!(%error, "403 Forbidden detected - skipping block"); + continue + } + error!(%error, "failed to prepare transaction for submission"); continue; } From 2dda3a8158116060297d85751e921acb856da949 Mon Sep 17 00:00:00 2001 From: dylan Date: Fri, 13 Jun 2025 18:20:16 -0600 Subject: [PATCH 2/4] fmt --- src/tasks/submit/task.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tasks/submit/task.rs b/src/tasks/submit/task.rs index a9ae6dd..4432a62 100644 --- a/src/tasks/submit/task.rs +++ b/src/tasks/submit/task.rs @@ -288,7 +288,7 @@ impl SubmitTask { if error.to_string().contains("403 Forbidden") { // Don't error as this is expected behavior warn!(%error, "403 Forbidden detected - skipping block"); - continue + continue; } error!(%error, "failed to prepare transaction for submission"); From e2ac449c6ec403b657a7c02e8b13631e286e0762 Mon Sep 17 00:00:00 2001 From: dylan Date: Mon, 16 Jun 2025 10:20:01 -0600 Subject: [PATCH 3/4] address review feedback --- src/tasks/submit/task.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/tasks/submit/task.rs b/src/tasks/submit/task.rs index 4432a62..1d19012 100644 --- a/src/tasks/submit/task.rs +++ b/src/tasks/submit/task.rs @@ -285,12 +285,6 @@ impl SubmitTask { { Ok(bumpable) => bumpable, Err(error) => { - if error.to_string().contains("403 Forbidden") { - // Don't error as this is expected behavior - warn!(%error, "403 Forbidden detected - skipping block"); - continue; - } - error!(%error, "failed to prepare transaction for submission"); continue; } From 309ff7cb8cfb23ac5c73477869abe6dd8430a197 Mon Sep 17 00:00:00 2001 From: dylan Date: Mon, 16 Jun 2025 11:06:15 -0600 Subject: [PATCH 4/4] rename initial to expected slot --- src/tasks/submit/task.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tasks/submit/task.rs b/src/tasks/submit/task.rs index 1d19012..900e86c 100644 --- a/src/tasks/submit/task.rs +++ b/src/tasks/submit/task.rs @@ -131,8 +131,8 @@ impl SubmitTask { ) -> eyre::Result { let submitting_start_time = Instant::now(); let now = utils::now(); - let (initial_slot, start, end) = self.calculate_slot_window(); - debug!(initial_slot, start, end, now, "calculating target slot window"); + let (expected_slot, start, end) = self.calculate_slot_window(); + debug!(expected_slot, start, end, now, "calculating target slot window"); let mut req = bumpable.req().clone(); @@ -147,7 +147,7 @@ impl SubmitTask { let inbound_result = match self.send_transaction(req).instrument(span.clone()).await { Ok(control_flow) => control_flow, Err(error) => { - if let Some(value) = self.slot_still_valid(initial_slot) { + if let Some(value) = self.slot_still_valid(expected_slot) { return value; } // Log error and retry @@ -160,7 +160,7 @@ impl SubmitTask { match inbound_result { ControlFlow::Retry => { - if let Some(value) = self.slot_still_valid(initial_slot) { + if let Some(value) = self.slot_still_valid(expected_slot) { return value; } // bump the req