From a09ee672a60a3584e68d11a19ad9751740eace73 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 26 Nov 2020 00:17:06 +0000 Subject: [PATCH] Separate blockstore checks for not (yet) rooted and cleaned up (#13814) (#13817) (cherry picked from commit 4ff0f0949ac6caf9e47df086d9aca6426a4d60d3) Co-authored-by: Tyera Eulberg --- 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())