From 09ff7202d5d9bbb18849f94686a8140ad7f0050f Mon Sep 17 00:00:00 2001 From: Vladimir Petrzhikovskii Date: Wed, 31 Jul 2024 14:42:52 +0200 Subject: [PATCH] fix(core): fail fast if provider fails to provide a block --- core/src/block_strider/mod.rs | 42 +++++++++++++++-------------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/core/src/block_strider/mod.rs b/core/src/block_strider/mod.rs index f882c39e3..3edb2b75f 100644 --- a/core/src/block_strider/mod.rs +++ b/core/src/block_strider/mod.rs @@ -141,6 +141,7 @@ where JoinTask::new(self.fetch_next_master_block(&self.state.load_last_mc_block_id())); while let Some(next) = next_master_fut.await { + let next = next?; // NOTE: Start fetching the next master block in parallel to the processing of the current one next_master_fut = JoinTask::new(self.fetch_next_master_block(next.id())); @@ -299,7 +300,7 @@ where fn fetch_next_master_block( &self, prev_block_id: &BlockId, - ) -> impl Future> + Send + 'static { + ) -> impl Future + Send + 'static { let _histogram = HistogramGuard::begin("tycho_core_download_mc_block_time"); tracing::debug!(%prev_block_id, "fetching next master block"); @@ -307,33 +308,26 @@ where let provider = self.provider.clone(); let prev_block_id = *prev_block_id; async move { - loop { - match provider.get_next_block(&prev_block_id).await? { - Ok(block) => break Some(block), - Err(e) => { - tracing::error!(?prev_block_id, "error while fetching master block: {e:?}"); - // TODO: backoff - - // NOTE: Give some time to breathe to tokio - tokio::task::yield_now().await; - } - } - } + provider.get_next_block(&prev_block_id).await.map(|r| { + r.map_err(|e| { + e.context(format!( + "BUGGY PROVIDER. failed to fetch master block: {}", + prev_block_id + )) + }) + }) } } async fn fetch_block(&self, block_id: &BlockId) -> Result { - loop { - match self.provider.get_block(block_id).await { - Some(Ok(block)) => break Ok(block), - Some(Err(e)) => { - tracing::error!("error while fetching block: {e:?}"); - tokio::task::yield_now().await; - // TODO: backoff - } - None => { - anyhow::bail!("block not found: {block_id}") - } + match self.provider.get_block(block_id).await { + Some(Ok(block)) => Ok(block), + Some(Err(e)) => Err(e.context(format!( + "BUGGY PROVIDER. failed to fetch block: {}", + block_id + ))), + None => { + anyhow::bail!("block not found: {block_id}") } } }