From dca8c5996a4b69e1544a481e1809d0deaf54c771 Mon Sep 17 00:00:00 2001 From: Riccardo Casatta Date: Mon, 30 Sep 2024 14:46:00 +0200 Subject: [PATCH] getblocks retry 5 times on 'Block not found on disk' --- src/daemon.rs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/daemon.rs b/src/daemon.rs index c9c0a835..6190f15f 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -38,6 +38,9 @@ lazy_static! { ); } +const MAX_ATTEMPTS: u32 = 5; +const RETRY_WAIT_DURATION: Duration = Duration::from_secs(1); + fn parse_hash(value: &Value) -> Result where T: FromStr, @@ -527,7 +530,28 @@ impl Daemon { .iter() .map(|hash| json!([hash, /*verbose=*/ false])) .collect(); - let values = self.requests("getblock", params_list)?; + + let mut attempts = MAX_ATTEMPTS; + let values = loop { + attempts -= 1; + + match self.requests("getblock", params_list.clone()) { + Ok(blocks) => break blocks, + Err(e) => { + let err_msg = format!("{e:?}"); + if err_msg.contains("Block not found on disk") { + // There is a small chance the node returns the header but didn't finish to index the block + log::warn!("getblocks failing with: {e:?} trying {attempts} more time") + } else { + panic!("failed to get blocks from bitcoind: {}", err_msg); + } + } + } + if attempts == 0 { + panic!("failed to get blocks from bitcoind") + } + std::thread::sleep(RETRY_WAIT_DURATION); + }; let mut blocks = vec![]; for value in values { blocks.push(block_from_value(value)?); @@ -596,7 +620,10 @@ impl Daemon { // Missing estimates are logged but do not cause a failure, whatever is available is returned #[allow(clippy::float_cmp)] pub fn estimatesmartfee_batch(&self, conf_targets: &[u16]) -> Result> { - let params_list: Vec = conf_targets.iter().map(|t| json!([t, "ECONOMICAL"])).collect(); + let params_list: Vec = conf_targets + .iter() + .map(|t| json!([t, "ECONOMICAL"])) + .collect(); Ok(self .requests("estimatesmartfee", params_list)?