mark_dirty_dead_stores (#25114)

This commit is contained in:
Jeff Washington (jwash) 2022-05-10 15:08:29 -05:00 committed by GitHub
parent e9e267947e
commit dc6e28099b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 24 additions and 12 deletions

View File

@ -2835,18 +2835,7 @@ impl AccountsDb {
// Purge old, overwritten storage entries
let mut start = Measure::start("write_storage_elapsed");
if let Some(slot_stores) = self.storage.get_slot_stores(slot) {
slot_stores.write().unwrap().retain(|_key, store| {
if store.count() == 0 {
self.dirty_stores
.insert((slot, store.append_vec_id()), store.clone());
dead_storages.push(store.clone());
false
} else {
true
}
});
}
self.mark_dirty_dead_stores(slot, &mut dead_storages, |store| store.count() > 0);
start.stop();
write_storage_elapsed = start.as_us();
}
@ -2901,6 +2890,29 @@ impl AccountsDb {
total_accounts_after_shrink
}
/// get stores for 'slot'
/// retain only the stores where 'should_retain(store)' == true
/// for stores not retained, insert in 'dirty_stores' and 'dead_storages'
fn mark_dirty_dead_stores(
&self,
slot: Slot,
dead_storages: &mut Vec<Arc<AccountStorageEntry>>,
should_retain: impl Fn(&AccountStorageEntry) -> bool,
) {
if let Some(slot_stores) = self.storage.get_slot_stores(slot) {
slot_stores.write().unwrap().retain(|_key, store| {
if !should_retain(store) {
self.dirty_stores
.insert((slot, store.append_vec_id()), store.clone());
dead_storages.push(store.clone());
false
} else {
true
}
});
}
}
fn drop_or_recycle_stores(&self, dead_storages: Vec<Arc<AccountStorageEntry>>) {
let mut recycle_stores_write_elapsed = Measure::start("recycle_stores_write_time");
let mut recycle_stores = self.recycle_stores.write().unwrap();