skip rewrites in bank (#23985)
This commit is contained in:
parent
b1c89cf6d4
commit
52f43a986d
|
@ -4834,21 +4834,43 @@ impl Bank {
|
||||||
// parallelize?
|
// parallelize?
|
||||||
let mut rent_debits = RentDebits::default();
|
let mut rent_debits = RentDebits::default();
|
||||||
let mut total_collected = CollectedInfo::default();
|
let mut total_collected = CollectedInfo::default();
|
||||||
for (pubkey, mut account, _loaded_slot) in accounts {
|
let bank_slot = self.slot();
|
||||||
|
let mut rewrites_skipped = Vec::with_capacity(accounts.len());
|
||||||
|
let can_skip_rewrites = self.rc.accounts.accounts_db.skip_rewrites;
|
||||||
|
for (pubkey, mut account, loaded_slot) in accounts {
|
||||||
|
let old_rent_epoch = account.rent_epoch();
|
||||||
let collected = self.rent_collector.collect_from_existing_account(
|
let collected = self.rent_collector.collect_from_existing_account(
|
||||||
&pubkey,
|
&pubkey,
|
||||||
&mut account,
|
&mut account,
|
||||||
self.rc.accounts.accounts_db.filler_account_suffix.as_ref(),
|
self.rc.accounts.accounts_db.filler_account_suffix.as_ref(),
|
||||||
);
|
);
|
||||||
total_collected += collected;
|
total_collected += collected;
|
||||||
// Store all of them unconditionally to purge old AppendVec,
|
// only store accounts where we collected rent
|
||||||
// even if collected rent is 0 (= not updated).
|
// but get the hash for all these accounts even if collected rent is 0 (= not updated).
|
||||||
// Also, there's another subtle side-effect from this: this
|
// Also, there's another subtle side-effect from this: this
|
||||||
// ensures we verify the whole on-chain state (= all accounts)
|
// ensures we verify the whole on-chain state (= all accounts)
|
||||||
// via the account delta hash slowly once per an epoch.
|
// via the bank delta hash slowly once per an epoch.
|
||||||
|
if can_skip_rewrites
|
||||||
|
&& Self::skip_rewrite(
|
||||||
|
bank_slot,
|
||||||
|
collected.rent_amount,
|
||||||
|
loaded_slot,
|
||||||
|
old_rent_epoch,
|
||||||
|
&account,
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// this would have been rewritten previously. Now we skip it.
|
||||||
|
// calculate the hash that we would have gotten if we did the rewrite.
|
||||||
|
// This will be needed to calculate the bank's hash.
|
||||||
|
let hash =
|
||||||
|
crate::accounts_db::AccountsDb::hash_account(self.slot(), &account, &pubkey);
|
||||||
|
rewrites_skipped.push((pubkey, hash));
|
||||||
|
} else if !just_rewrites {
|
||||||
self.store_account(&pubkey, &account);
|
self.store_account(&pubkey, &account);
|
||||||
|
}
|
||||||
rent_debits.insert(&pubkey, collected.rent_amount, account.lamports());
|
rent_debits.insert(&pubkey, collected.rent_amount, account.lamports());
|
||||||
}
|
}
|
||||||
|
self.remember_skipped_rewrites(rewrites_skipped);
|
||||||
self.collected_rent
|
self.collected_rent
|
||||||
.fetch_add(total_collected.rent_amount, Relaxed);
|
.fetch_add(total_collected.rent_amount, Relaxed);
|
||||||
self.rewards
|
self.rewards
|
||||||
|
@ -4866,7 +4888,6 @@ impl Bank {
|
||||||
}
|
}
|
||||||
|
|
||||||
// put 'rewrites_skipped' into 'self.rewrites_skipped_this_slot'
|
// put 'rewrites_skipped' into 'self.rewrites_skipped_this_slot'
|
||||||
#[allow(dead_code)]
|
|
||||||
fn remember_skipped_rewrites(&self, rewrites_skipped: Vec<(Pubkey, Hash)>) {
|
fn remember_skipped_rewrites(&self, rewrites_skipped: Vec<(Pubkey, Hash)>) {
|
||||||
if !rewrites_skipped.is_empty() {
|
if !rewrites_skipped.is_empty() {
|
||||||
let mut rewrites_skipped_this_slot = self.rewrites_skipped_this_slot.write().unwrap();
|
let mut rewrites_skipped_this_slot = self.rewrites_skipped_this_slot.write().unwrap();
|
||||||
|
@ -4877,7 +4898,6 @@ impl Bank {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// return true iff storing this account is just a rewrite and can be skipped
|
/// return true iff storing this account is just a rewrite and can be skipped
|
||||||
#[allow(dead_code)]
|
|
||||||
fn skip_rewrite(
|
fn skip_rewrite(
|
||||||
bank_slot: Slot,
|
bank_slot: Slot,
|
||||||
rent_amount: u64,
|
rent_amount: u64,
|
||||||
|
|
Loading…
Reference in New Issue