Skip to content

Commit 32b677b

Browse files
authored
Verifies accounts before clean/shrink (solana-labs#3592)
1 parent 73f94d5 commit 32b677b

File tree

1 file changed

+35
-28
lines changed

1 file changed

+35
-28
lines changed

runtime/src/bank.rs

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6190,6 +6190,41 @@ impl Bank {
61906190
base: Option<(Slot, /*capitalization*/ u64)>,
61916191
duplicates_lt_hash: Option<Box<DuplicatesLtHash>>,
61926192
) -> bool {
6193+
// If we verify the accounts using the lattice-based hash *and* with storages (as opposed
6194+
// to the index), then we rely on the DuplicatesLtHash as given by generate_index(). Since
6195+
// the duplicates are based on a specific set of storages, we must use the exact same
6196+
// storages to do the lattice-based accounts verification. This means we must wait to
6197+
// clean/shrink until *after* we've gotten Arcs to the storages (this prevents their
6198+
// untimely removal). Simply, we call `verify_accounts_hash()` before we call `clean` or
6199+
// `shrink`.
6200+
let (verified_accounts, verify_accounts_time_us) = measure_us!({
6201+
let should_verify_accounts = !self.rc.accounts.accounts_db.skip_initial_hash_calc;
6202+
if should_verify_accounts {
6203+
info!("Verifying accounts...");
6204+
let verified = self.verify_accounts_hash(
6205+
base,
6206+
VerifyAccountsHashConfig {
6207+
test_hash_calculation,
6208+
ignore_mismatch: false,
6209+
require_rooted_bank: false,
6210+
run_in_background: true,
6211+
store_hash_raw_data_for_debug: false,
6212+
},
6213+
duplicates_lt_hash,
6214+
);
6215+
info!("Verifying accounts... In background.");
6216+
verified
6217+
} else {
6218+
info!("Verifying accounts... Skipped.");
6219+
self.rc
6220+
.accounts
6221+
.accounts_db
6222+
.verify_accounts_hash_in_bg
6223+
.verification_complete();
6224+
true
6225+
}
6226+
});
6227+
61936228
let (_, clean_time_us) = measure_us!({
61946229
let should_clean = force_clean || (!skip_shrink && self.slot() > 0);
61956230
if should_clean {
@@ -6225,34 +6260,6 @@ impl Bank {
62256260
}
62266261
});
62276262

6228-
let (verified_accounts, verify_accounts_time_us) = measure_us!({
6229-
let should_verify_accounts = !self.rc.accounts.accounts_db.skip_initial_hash_calc;
6230-
if should_verify_accounts {
6231-
info!("Verifying accounts...");
6232-
let verified = self.verify_accounts_hash(
6233-
base,
6234-
VerifyAccountsHashConfig {
6235-
test_hash_calculation,
6236-
ignore_mismatch: false,
6237-
require_rooted_bank: false,
6238-
run_in_background: true,
6239-
store_hash_raw_data_for_debug: false,
6240-
},
6241-
duplicates_lt_hash,
6242-
);
6243-
info!("Verifying accounts... In background.");
6244-
verified
6245-
} else {
6246-
info!("Verifying accounts... Skipped.");
6247-
self.rc
6248-
.accounts
6249-
.accounts_db
6250-
.verify_accounts_hash_in_bg
6251-
.verification_complete();
6252-
true
6253-
}
6254-
});
6255-
62566263
info!("Verifying bank...");
62576264
let (verified_bank, verify_bank_time_us) = measure_us!(self.verify_hash());
62586265
info!("Verifying bank... Done.");

0 commit comments

Comments
 (0)