is_candidate_for_shrink respects ancient append vecs (#25205)

This commit is contained in:
Jeff Washington (jwash) 2022-05-13 16:26:46 -05:00 committed by GitHub
parent 3c70220142
commit cb037e49ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 8 deletions

View File

@ -37,6 +37,7 @@ use {
accounts_update_notifier_interface::AccountsUpdateNotifier, accounts_update_notifier_interface::AccountsUpdateNotifier,
active_stats::{ActiveStatItem, ActiveStats}, active_stats::{ActiveStatItem, ActiveStats},
ancestors::Ancestors, ancestors::Ancestors,
ancient_append_vecs::is_ancient,
append_vec::{AppendVec, StoredAccountMeta, StoredMeta, StoredMetaWriteVersion}, append_vec::{AppendVec, StoredAccountMeta, StoredMeta, StoredMetaWriteVersion},
bank::Rewrites, bank::Rewrites,
cache_hash_data::CacheHashData, cache_hash_data::CacheHashData,
@ -6319,13 +6320,26 @@ impl AccountsDb {
true true
} }
fn is_candidate_for_shrink(&self, store: &Arc<AccountStorageEntry>) -> bool { fn is_candidate_for_shrink(
&self,
store: &Arc<AccountStorageEntry>,
allow_shrink_ancient: bool,
) -> bool {
let total_bytes = if is_ancient(&store.accounts) {
if !allow_shrink_ancient {
return false;
}
store.written_bytes()
} else {
store.total_bytes()
};
match self.shrink_ratio { match self.shrink_ratio {
AccountShrinkThreshold::TotalSpace { shrink_ratio: _ } => { AccountShrinkThreshold::TotalSpace { shrink_ratio: _ } => {
Self::page_align(store.alive_bytes() as u64) < store.total_bytes() Self::page_align(store.alive_bytes() as u64) < total_bytes
} }
AccountShrinkThreshold::IndividualStore { shrink_ratio } => { AccountShrinkThreshold::IndividualStore { shrink_ratio } => {
(Self::page_align(store.alive_bytes() as u64) as f64 / store.total_bytes() as f64) (Self::page_align(store.alive_bytes() as u64) as f64 / total_bytes as f64)
< shrink_ratio < shrink_ratio
} }
} }
@ -6370,7 +6384,7 @@ impl AccountsDb {
dead_slots.insert(*slot); dead_slots.insert(*slot);
} else if self.caching_enabled } else if self.caching_enabled
&& Self::is_shrinking_productive(*slot, &[store.clone()]) && Self::is_shrinking_productive(*slot, &[store.clone()])
&& self.is_candidate_for_shrink(&store) && self.is_candidate_for_shrink(&store, false)
{ {
// Checking that this single storage entry is ready for shrinking, // Checking that this single storage entry is ready for shrinking,
// should be a sufficient indication that the slot is ready to be shrunk // should be a sufficient indication that the slot is ready to be shrunk
@ -13708,14 +13722,14 @@ pub mod tests {
} }
} }
entry.alive_bytes.store(3000, Ordering::Release); entry.alive_bytes.store(3000, Ordering::Release);
assert!(accounts.is_candidate_for_shrink(&entry)); assert!(accounts.is_candidate_for_shrink(&entry, false));
entry.alive_bytes.store(5000, Ordering::Release); entry.alive_bytes.store(5000, Ordering::Release);
assert!(!accounts.is_candidate_for_shrink(&entry)); assert!(!accounts.is_candidate_for_shrink(&entry, false));
accounts.shrink_ratio = AccountShrinkThreshold::TotalSpace { shrink_ratio: 0.3 }; accounts.shrink_ratio = AccountShrinkThreshold::TotalSpace { shrink_ratio: 0.3 };
entry.alive_bytes.store(3000, Ordering::Release); entry.alive_bytes.store(3000, Ordering::Release);
assert!(accounts.is_candidate_for_shrink(&entry)); assert!(accounts.is_candidate_for_shrink(&entry, false));
accounts.shrink_ratio = AccountShrinkThreshold::IndividualStore { shrink_ratio: 0.3 }; accounts.shrink_ratio = AccountShrinkThreshold::IndividualStore { shrink_ratio: 0.3 };
assert!(!accounts.is_candidate_for_shrink(&entry)); assert!(!accounts.is_candidate_for_shrink(&entry, false));
} }
#[test] #[test]