diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index be500c6222..a722d14d59 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -1804,9 +1804,9 @@ impl Blockstore { (transaction_status_cf_primary_index, signature, 0), IteratorDirection::Forward, ))?; - for ((_, sig, slot), data) in index_iterator { + for ((i, sig, slot), data) in index_iterator { counter += 1; - if sig != signature { + if i != transaction_status_cf_primary_index || sig != signature { break; } if self.is_root(slot) { @@ -1842,8 +1842,9 @@ impl Blockstore { ("method", "get_confirmed_transaction".to_string(), String) ); if let Some((slot, status)) = self.get_transaction_status(signature)? { - let transaction = self.find_transaction_in_slot(slot, signature)? - .expect("Transaction to exist in slot entries if it exists in statuses and hasn't been cleaned up"); + let transaction = self + .find_transaction_in_slot(slot, signature)? + .ok_or(BlockstoreError::TransactionStatusSlotMismatch)?; // Should not happen let encoding = encoding.unwrap_or(UiTransactionEncoding::Json); let encoded_transaction = EncodedTransaction::encode(transaction, encoding); Ok(Some(ConfirmedTransaction { diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index edfcd985a4..93409f23d9 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -58,6 +58,7 @@ pub enum BlockstoreError { SlotCleanedUp, UnpackError(#[from] UnpackError), UnableToSetOpenFileDescriptorLimit, + TransactionStatusSlotMismatch, } pub type Result = std::result::Result;