From d5c70d17da4777a7a2629fcdc58e706dae1c7e14 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Mon, 28 Feb 2022 15:46:06 -0700 Subject: [PATCH 1/3] Bump first-available block to first complete block --- ledger/src/blockstore.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index 88700eeaa26041..fb73f1bed164a7 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -1944,9 +1944,13 @@ impl Blockstore { self.block_height_cf.put(slot, &block_height) } + /// The first complete block that is available in the Blockstore ledger pub fn get_first_available_block(&self) -> Result { let mut root_iterator = self.rooted_slot_iterator(self.lowest_slot())?; - Ok(root_iterator.next().unwrap_or_default()) + // The block at root-index 0 cannot be complete, because it is missing its parent + // blockhash. A parent blockhash must be calculated from the entries of the previous block. + // Therefore, the first available complete block is that at root-index 1. + Ok(root_iterator.nth(1).unwrap_or_default()) } pub fn get_rooted_block( From 70604493e859d1c401bc12e644fdac88ebf8f304 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Mon, 28 Feb 2022 15:46:54 -0700 Subject: [PATCH 2/3] Remove obsolete purges in tests (PrimaryIndex toggling no longer in use --- ledger/src/blockstore.rs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index fb73f1bed164a7..5cdc4f629f1702 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -7365,8 +7365,6 @@ pub mod tests { ) .unwrap(); } - // Purge to freeze index 0 - blockstore.run_purge(0, 1, PurgeType::PrimaryIndex).unwrap(); let slot1 = 20; for x in 5..9 { let signature = Signature::new(&[x; 64]); @@ -7515,8 +7513,6 @@ pub mod tests { ) .unwrap(); } - // Purge to freeze index 0 - blockstore.run_purge(0, 1, PurgeType::PrimaryIndex).unwrap(); for x in 7..9 { let signature = Signature::new(&[x; 64]); blockstore @@ -7574,6 +7570,9 @@ pub mod tests { let ledger_path = get_tmp_ledger_path_auto_delete!(); let blockstore = Blockstore::open(ledger_path.path()).unwrap(); + let (shreds, _) = make_slot_entries(1, 0, 4); + blockstore.insert_shreds(shreds, None, false).unwrap(); + fn make_slot_entries_with_transaction_addresses(addresses: &[Pubkey]) -> Vec { let mut entries: Vec = Vec::new(); for address in addresses { @@ -7601,11 +7600,7 @@ pub mod tests { let shreds = entries_to_test_shreds(&entries, slot, slot - 1, true, 0); blockstore.insert_shreds(shreds, None, false).unwrap(); - for (i, entry) in entries.into_iter().enumerate() { - if slot == 4 && i == 2 { - // Purge to freeze index 0 and write address-signatures in new primary index - blockstore.run_purge(0, 1, PurgeType::PrimaryIndex).unwrap(); - } + for entry in entries.into_iter() { for transaction in entry.transactions { assert_eq!(transaction.signatures.len(), 1); blockstore From 37c3d32e1e8db26898821d6965c7a6d463e0a5ef Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Mon, 28 Feb 2022 16:27:52 -0700 Subject: [PATCH 3/3] Check first-available block in Rpc check_slot_cleaned_up --- rpc/src/rpc.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/rpc/src/rpc.rs b/rpc/src/rpc.rs index b29e24c9f5af32..8a06896a02132e 100644 --- a/rpc/src/rpc.rs +++ b/rpc/src/rpc.rs @@ -941,15 +941,20 @@ impl JsonRpcRequestProcessor { result: &std::result::Result, slot: Slot, ) -> Result<()> { + let first_available_block = self + .blockstore + .get_first_available_block() + .unwrap_or_default(); + let err: Error = RpcCustomError::BlockCleanedUp { + slot, + first_available_block, + } + .into(); if let Err(BlockstoreError::SlotCleanedUp) = result { - return Err(RpcCustomError::BlockCleanedUp { - slot, - first_available_block: self - .blockstore - .get_first_available_block() - .unwrap_or_default(), - } - .into()); + return Err(err); + } + if slot < first_available_block { + return Err(err); } Ok(()) }