Fix accounts_db store counts in purging accounts logic (#8218)
* Show insufficient purge_zero_lamport_account logic * Add another pass to detect non-deleted values and increment the count Co-authored-by: Ryo Onodera <ryoqun@gmail.com>
This commit is contained in:
parent
ed87229cec
commit
a8028fbb93
|
@ -649,6 +649,21 @@ impl AccountsDB {
|
|||
}
|
||||
}
|
||||
|
||||
for account_infos in purges.values() {
|
||||
let mut no_delete = false;
|
||||
for (_slot_id, account_info) in account_infos {
|
||||
if *store_counts.get(&account_info.store_id).unwrap() != 0 {
|
||||
no_delete = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if no_delete {
|
||||
for (_slot_id, account_info) in account_infos {
|
||||
*store_counts.get_mut(&account_info.store_id).unwrap() += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Only keep purges where the entire history of the account in the root set
|
||||
// can be purged. All AppendVecs for those updates are dead.
|
||||
purges.retain(|_pubkey, account_infos| {
|
||||
|
@ -2126,6 +2141,57 @@ pub mod tests {
|
|||
assert_load_account(&accounts, current_slot, pubkey, zero_lamport);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_accounts_purge_chained() {
|
||||
solana_logger::setup();
|
||||
|
||||
let some_lamport = 223;
|
||||
let zero_lamport = 0;
|
||||
let dummy_lamport = 999;
|
||||
let no_data = 0;
|
||||
let owner = Account::default().owner;
|
||||
|
||||
let account = Account::new(some_lamport, no_data, &owner);
|
||||
let account2 = Account::new(some_lamport + 100_001, no_data, &owner);
|
||||
let account3 = Account::new(some_lamport + 100_002, no_data, &owner);
|
||||
let zero_lamport_account = Account::new(zero_lamport, no_data, &owner);
|
||||
|
||||
let pubkey = Pubkey::new_rand();
|
||||
let purged_pubkey1 = Pubkey::new_rand();
|
||||
let purged_pubkey2 = Pubkey::new_rand();
|
||||
|
||||
let dummy_account = Account::new(dummy_lamport, no_data, &owner);
|
||||
let dummy_pubkey = Pubkey::default();
|
||||
|
||||
let accounts = AccountsDB::new_single();
|
||||
|
||||
let mut current_slot = 1;
|
||||
accounts.store(current_slot, &[(&pubkey, &account)]);
|
||||
accounts.store(current_slot, &[(&purged_pubkey1, &account2)]);
|
||||
accounts.add_root(current_slot);
|
||||
|
||||
current_slot += 1;
|
||||
accounts.store(current_slot, &[(&purged_pubkey1, &zero_lamport_account)]);
|
||||
accounts.store(current_slot, &[(&purged_pubkey2, &account3)]);
|
||||
accounts.add_root(current_slot);
|
||||
|
||||
current_slot += 1;
|
||||
accounts.store(current_slot, &[(&purged_pubkey2, &zero_lamport_account)]);
|
||||
accounts.add_root(current_slot);
|
||||
|
||||
current_slot += 1;
|
||||
accounts.store(current_slot, &[(&dummy_pubkey, &dummy_account)]);
|
||||
accounts.add_root(current_slot);
|
||||
|
||||
purge_zero_lamport_accounts(&accounts, current_slot);
|
||||
let accounts = reconstruct_accounts_db_via_serialization(&accounts, current_slot);
|
||||
|
||||
assert_load_account(&accounts, current_slot, pubkey, some_lamport);
|
||||
assert_load_account(&accounts, current_slot, purged_pubkey1, 0);
|
||||
assert_load_account(&accounts, current_slot, purged_pubkey2, 0);
|
||||
assert_load_account(&accounts, current_slot, dummy_pubkey, dummy_lamport);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn test_store_account_stress() {
|
||||
|
|
Loading…
Reference in New Issue