From 4ff0f0949ac6caf9e47df086d9aca6426a4d60d3 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Wed, 25 Nov 2020 15:59:38 -0700 Subject: [PATCH] Separate blockstore checks for not (yet) rooted and cleaned up (#13814) --- core/src/rpc.rs | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/core/src/rpc.rs b/core/src/rpc.rs index 9fe42daa85..33bb7db99c 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -599,7 +599,25 @@ impl JsonRpcRequestProcessor { } } - fn check_slot_blockstore_status( + fn check_blockstore_max_root( + &self, + result: &std::result::Result, + slot: Slot, + ) -> Result<()> + where + T: std::fmt::Debug, + { + if result.is_err() { + if let BlockstoreError::SlotNotRooted = result.as_ref().unwrap_err() { + if slot > self.blockstore.max_root() { + return Err(RpcCustomError::BlockNotAvailable { slot }.into()); + } + } + } + Ok(()) + } + + fn check_slot_cleaned_up( &self, result: &std::result::Result, slot: Slot, @@ -618,9 +636,6 @@ impl JsonRpcRequestProcessor { } .into()); } - if let BlockstoreError::SlotNotRooted = result.as_ref().unwrap_err() { - return Err(RpcCustomError::BlockNotAvailable { slot }.into()); - } } Ok(()) } @@ -640,6 +655,7 @@ impl JsonRpcRequestProcessor { .highest_confirmed_root() { let result = self.blockstore.get_confirmed_block(slot); + self.check_blockstore_max_root(&result, slot)?; if result.is_err() { if let Some(bigtable_ledger_storage) = &self.bigtable_ledger_storage { return Ok(self @@ -649,7 +665,7 @@ impl JsonRpcRequestProcessor { .map(|confirmed_block| confirmed_block.encode(encoding))); } } - self.check_slot_blockstore_status(&result, slot)?; + self.check_slot_cleaned_up(&result, slot)?; Ok(result .ok() .map(|confirmed_block| confirmed_block.encode(encoding))) @@ -745,6 +761,7 @@ impl JsonRpcRequestProcessor { .highest_confirmed_root() { let result = self.blockstore.get_block_time(slot); + self.check_blockstore_max_root(&result, slot)?; if result.is_err() { if let Some(bigtable_ledger_storage) = &self.bigtable_ledger_storage { return Ok(self @@ -754,7 +771,7 @@ impl JsonRpcRequestProcessor { .and_then(|confirmed_block| confirmed_block.block_time)); } } - self.check_slot_blockstore_status(&result, slot)?; + self.check_slot_cleaned_up(&result, slot)?; Ok(result.ok().unwrap_or(None)) } else { Err(RpcCustomError::BlockNotAvailable { slot }.into())