add AccountStorage.get_slot_storage_entry (#29480)

This commit is contained in:
Jeff Washington (jwash) 2023-01-03 14:10:34 -06:00 committed by GitHub
parent e5323166b3
commit 95d2f002bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 20 deletions

View File

@ -32,6 +32,17 @@ impl AccountStorage {
self.map.get(&slot).map(|result| result.value().clone()) self.map.get(&slot).map(|result| result.value().clone())
} }
/// return the append vec for 'slot' if it exists
/// This is only ever called when shrink is not possibly running and there is a max of 1 append vec per slot.
pub(crate) fn get_slot_storage_entry(&self, slot: Slot) -> Option<Arc<AccountStorageEntry>> {
self.get_slot_stores(slot).and_then(|res| {
let read = res.read().unwrap();
assert!(read.len() <= 1);
read.values().next().cloned()
})
}
/// return all append vecs for 'slot' if any exist
pub(crate) fn get_slot_storage_entries(&self, slot: Slot) -> Option<SnapshotStorage> { pub(crate) fn get_slot_storage_entries(&self, slot: Slot) -> Option<SnapshotStorage> {
self.get_slot_stores(slot) self.get_slot_stores(slot)
.map(|res| res.read().unwrap().values().cloned().collect()) .map(|res| res.read().unwrap().values().cloned().collect())

View File

@ -2960,11 +2960,7 @@ impl AccountsDb {
if slot > max_slot_inclusive { if slot > max_slot_inclusive {
return; return;
} }
for storage in self if let Some(storage) = self.storage.get_slot_storage_entry(slot) {
.storage
.get_slot_storage_entries(slot)
.unwrap_or_default()
{
storage.all_accounts().iter().for_each(|account| { storage.all_accounts().iter().for_each(|account| {
let pk = account.pubkey(); let pk = account.pubkey();
match pubkey_refcount.entry(*pk) { match pubkey_refcount.entry(*pk) {
@ -4833,7 +4829,7 @@ impl AccountsDb {
Ok(used_index) Ok(used_index)
} }
/// Scan a specific slot through all the account storage in parallel /// Scan a specific slot through all the account storage
pub fn scan_account_storage<R, B>( pub fn scan_account_storage<R, B>(
&self, &self,
slot: Slot, slot: Slot,
@ -4875,17 +4871,12 @@ impl AccountsDb {
// If the slot is not in the cache, then all the account information must have // If the slot is not in the cache, then all the account information must have
// been flushed. This is guaranteed because we only remove the rooted slot from // been flushed. This is guaranteed because we only remove the rooted slot from
// the cache *after* we've finished flushing in `flush_slot_cache`. // the cache *after* we've finished flushing in `flush_slot_cache`.
let storage_maps = self if let Some(storage) = self.storage.get_slot_storage_entry(slot) {
.storage storage
.get_slot_storage_entries(slot) .accounts
.unwrap_or_default(); .account_iter()
self.thread_pool.install(|| { .for_each(|account| storage_scan_func(&retval, LoadedAccount::Stored(account)));
storage_maps.par_iter().for_each(|storage| { }
storage.accounts.account_iter().for_each(|account| {
storage_scan_func(&retval, LoadedAccount::Stored(account))
})
});
});
ScanStorageResult::Stored(retval) ScanStorageResult::Stored(retval)
} }
@ -8963,10 +8954,13 @@ impl AccountsDb {
for (index, slot) in slots.iter().enumerate() { for (index, slot) in slots.iter().enumerate() {
let mut scan_time = Measure::start("scan"); let mut scan_time = Measure::start("scan");
log_status.report(index as u64); log_status.report(index as u64);
let storage_maps = self.storage.get_slot_storage_entries(*slot); let storage = self
let accounts_map = storage_maps .storage
.get_slot_storage_entry(*slot)
.map(|storage| vec![storage]);
let accounts_map = storage
.as_ref() .as_ref()
.map(|storage_maps| self.process_storage_slot(storage_maps)) .map(|storage| self.process_storage_slot(storage))
.unwrap_or_default(); .unwrap_or_default();
scan_time.stop(); scan_time.stop();