remove concept of 'full' ancient append vec (#28449)

This commit is contained in:
Jeff Washington (jwash) 2022-10-18 15:08:04 -07:00 committed by GitHub
parent c89bd0d6a4
commit ca115594ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 61 deletions

View File

@ -38,8 +38,7 @@ use {
active_stats::{ActiveStatItem, ActiveStats},
ancestors::Ancestors,
ancient_append_vecs::{
get_ancient_append_vec_capacity, is_ancient, is_full_ancient, AccountsToStore,
StorageSelector,
get_ancient_append_vec_capacity, is_ancient, AccountsToStore, StorageSelector,
},
append_vec::{AppendVec, StoredAccountMeta, StoredMeta, StoredMetaWriteVersion},
bank::Rewrites,
@ -4212,27 +4211,22 @@ impl AccountsDb {
let storage = all_storages.first().unwrap();
let accounts = &storage.accounts;
// randomly shrink ancient slots
// this exercises the ancient shrink code more often
let random_shrink =
can_randomly_shrink && thread_rng().gen_range(0, 100) == 0 && is_ancient(accounts);
if is_full_ancient(accounts) || random_shrink {
if self.is_candidate_for_shrink(storage, true) || random_shrink {
// we are full, but we are a candidate for shrink, so either append us to the previous append vec
// or recreate us as a new append vec and eliminate some contents
if is_ancient(accounts) {
// randomly shrink ancient slots
// this exercises the ancient shrink code more often
if self.is_candidate_for_shrink(storage, true)
|| (can_randomly_shrink
&& thread_rng().gen_range(0, 100) == 0
&& is_ancient(accounts))
{
// we are a candidate for shrink, so either append us to the previous append vec
// or recreate us as a new append vec and eliminate the dead accounts
info!("ancient_append_vec: shrinking full ancient: {}", slot);
self.shrink_ancient_stats
.ancient_append_vecs_shrunk
.fetch_add(1, Ordering::Relaxed);
return true;
}
// since we skipped an ancient append vec, we don't want to append to whatever append vec USED to be the current one
*current_ancient = None;
return false; // skip this full ancient append vec completely
}
if is_ancient(accounts) {
// this slot is ancient and can become the 'current' ancient for other slots to be squashed into
*current_ancient = Some((slot, Arc::clone(storage)));
return false; // we're done with this slot - this slot IS the ancient append vec
@ -17127,6 +17121,7 @@ pub mod tests {
assert_eq!(current_ancient.0, slot2_ancient);
// now try a full ancient append vec
// current is None
let slot3_full_ancient = 3;
let mut current_ancient = None;
let full_ancient_3 = make_full_ancient_append_vec(&db, slot3_full_ancient);
@ -17137,9 +17132,14 @@ pub mod tests {
false,
);
assert!(!should_move);
assert!(current_ancient.is_none());
let current_ancient = current_ancient.unwrap();
assert_eq!(
current_ancient.1.append_vec_id(),
full_ancient_3.append_vec_id()
);
assert_eq!(current_ancient.0, slot3_full_ancient);
// now set current_ancient to something and see if it still goes to None
// now set current_ancient to something
let mut current_ancient = Some((slot1_ancient, ancient1.clone()));
let should_move = db.should_move_to_ancient_append_vec(
&vec![full_ancient_3.clone()],
@ -17148,7 +17148,12 @@ pub mod tests {
false,
);
assert!(!should_move);
assert!(current_ancient.is_none());
let current_ancient = current_ancient.unwrap();
assert_eq!(
current_ancient.1.append_vec_id(),
full_ancient_3.append_vec_id()
);
assert_eq!(current_ancient.0, slot3_full_ancient);
// now mark the full ancient as candidate for shrink
adjust_alive_bytes(&full_ancient_3, 0);
@ -17185,7 +17190,7 @@ pub mod tests {
fn make_ancient_append_vec_full(ancient: &Arc<AccountStorageEntry>) {
let vecs = vec![vec![ancient.clone()]];
while !is_full_ancient(&ancient.accounts) {
for _ in 0..100 {
append_sample_data_to_storage(&vecs, &Pubkey::default(), 0);
}
adjust_alive_bytes(ancient, ancient.total_bytes() as usize);
@ -17196,12 +17201,4 @@ pub mod tests {
make_ancient_append_vec_full(&full);
full
}
#[test]
fn test_make_full_ancient_append_vec() {
let db = AccountsDb::new_single_for_tests();
let full = make_full_ancient_append_vec(&db, 1);
assert!(is_ancient(&full.accounts));
assert!(is_full_ancient(&full.accounts));
}
}

View File

@ -96,14 +96,6 @@ pub fn get_ancient_append_vec_capacity() -> u64 {
MAXIMUM_APPEND_VEC_FILE_SIZE / 10 - 2048
}
/// true iff storage is ancient size and is almost completely full
pub fn is_full_ancient(storage: &AppendVec) -> bool {
// not sure of slop amount here. Maybe max account size with 10MB data?
// append vecs can't usually be made entirely full
let threshold_bytes = 10_000;
is_ancient(storage) && storage.remaining_bytes() < threshold_bytes
}
/// is this a max-size append vec designed to be used as an ancient append vec?
pub fn is_ancient(storage: &AppendVec) -> bool {
storage.capacity() >= get_ancient_append_vec_capacity()
@ -219,30 +211,6 @@ pub mod tests {
let av = AppendVec::new(&tf.path, true, size as usize);
assert_eq!(expected_ancient, is_ancient(&av));
assert!(!is_full_ancient(&av));
}
}
#[test]
fn test_is_full_ancient() {
let size = get_ancient_append_vec_capacity();
let tf = crate::append_vec::test_utils::get_append_vec_path("test_is_ancient");
let (_temp_dirs, _paths) = get_temp_accounts_paths(1).unwrap();
let av = AppendVec::new(&tf.path, true, size as usize);
assert!(is_ancient(&av));
assert!(!is_full_ancient(&av));
let overhead = 400;
let data_len = size - overhead;
let mut account = AccountSharedData::default();
account.set_data(vec![0; data_len as usize]);
let sm = StoredMeta {
write_version: 0,
pubkey: Pubkey::new(&[0; 32]),
data_len: data_len as u64,
};
av.append_accounts(&[(sm, Some(&account))], &[Hash::default()]);
assert!(is_ancient(&av));
assert!(is_full_ancient(&av), "Remaining: {}", av.remaining_bytes());
}
}