add AccountStorage.get_slot_storage_entry (#29480)
This commit is contained in:
parent
e5323166b3
commit
95d2f002bd
|
@ -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())
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue