Fix off-by-one bug in Blockstore::purge_exact() (#33463)

This commit is contained in:
steviez 2023-09-30 00:14:40 +02:00 committed by GitHub
parent ec2e1241a1
commit 4866789b67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 2 deletions

View File

@ -354,8 +354,7 @@ impl Blockstore {
) -> Result<()> {
let mut index0 = self.transaction_status_index_cf.get(0)?.unwrap_or_default();
let mut index1 = self.transaction_status_index_cf.get(1)?.unwrap_or_default();
let to_slot = to_slot.saturating_add(1);
for slot in from_slot..to_slot {
for slot in from_slot..=to_slot {
let slot_entries = self.get_any_valid_slot_entries(slot, 0);
let transactions = slot_entries
.into_iter()
@ -1100,6 +1099,27 @@ pub mod tests {
assert_eq!(entry.0, 2); // Buffer entry, no index 1 entries remaining
drop(status_entry_iterator);
// Purge up to but not including index0_max_slot
clear_and_repopulate_transaction_statuses_for_test(
&blockstore,
index0_max_slot,
index1_max_slot,
);
blockstore
.run_purge(0, index0_max_slot - 1, PurgeType::Exact)
.unwrap();
assert_eq!(
blockstore
.transaction_status_index_cf
.get(0)
.unwrap()
.unwrap(),
TransactionStatusIndexMeta {
max_slot: index0_max_slot,
frozen: true,
}
);
// Test purge all
clear_and_repopulate_transaction_statuses_for_test(
&blockstore,