remove flatten in storage scan (#17354)

* remove flatten in storage scan

* fix tests
This commit is contained in:
Jeff Washington (jwash)
2021-05-21 09:26:46 -05:00
committed by GitHub
parent 5e6b00fe98
commit 2f55547d37
2 changed files with 17 additions and 43 deletions

View File

@ -4088,35 +4088,31 @@ impl AccountsDb {
/// Scan through all the account storage in parallel /// Scan through all the account storage in parallel
fn scan_account_storage_no_bank<F, B>( fn scan_account_storage_no_bank<F, B>(
snapshot_storages: &[SnapshotStorage], snapshot_storages: &[SnapshotStorage],
stats: &mut crate::accounts_hash::HashStats,
scan_func: F, scan_func: F,
) -> Vec<B> ) -> Vec<B>
where where
F: Fn(LoadedAccount, &mut B, Slot) + Send + Sync, F: Fn(LoadedAccount, &mut B, Slot) + Send + Sync,
B: Send + Default, B: Send + Default,
{ {
let mut time = Measure::start("flatten");
let items: Vec<_> = snapshot_storages.iter().flatten().collect();
time.stop();
stats.pre_scan_flatten_time_total_us += time.as_us();
// Without chunks, we end up with 1 output vec for each outer snapshot storage. // Without chunks, we end up with 1 output vec for each outer snapshot storage.
// This results in too many vectors to be efficient. // This results in too many vectors to be efficient.
const MAX_ITEMS_PER_CHUNK: usize = 5_000; const MAX_ITEMS_PER_CHUNK: usize = 5_000;
items snapshot_storages
.par_chunks(MAX_ITEMS_PER_CHUNK) .par_chunks(MAX_ITEMS_PER_CHUNK)
.map(|storages: &[&Arc<AccountStorageEntry>]| { .map(|storages: &[Vec<Arc<AccountStorageEntry>>]| {
let mut retval = B::default(); let mut retval = B::default();
for storage in storages { for sub_storages in storages {
let accounts = storage.accounts.accounts(0); for storage in sub_storages {
accounts.into_iter().for_each(|stored_account| { let accounts = storage.accounts.accounts(0);
scan_func( accounts.into_iter().for_each(|stored_account| {
LoadedAccount::Stored(stored_account), scan_func(
&mut retval, LoadedAccount::Stored(stored_account),
storage.slot(), &mut retval,
) storage.slot(),
}); )
});
}
} }
retval retval
}) })
@ -4181,7 +4177,6 @@ impl AccountsDb {
stats.num_snapshot_storage = storage.len(); stats.num_snapshot_storage = storage.len();
let result: Vec<Vec<Vec<CalculateHashIntermediate>>> = Self::scan_account_storage_no_bank( let result: Vec<Vec<Vec<CalculateHashIntermediate>>> = Self::scan_account_storage_no_bank(
&storage, &storage,
&mut stats,
|loaded_account: LoadedAccount, |loaded_account: LoadedAccount,
accum: &mut Vec<Vec<CalculateHashIntermediate>>, accum: &mut Vec<Vec<CalculateHashIntermediate>>,
slot: Slot| { slot: Slot| {
@ -5763,6 +5758,7 @@ pub mod tests {
#[test] #[test]
fn test_accountsdb_scan_snapshot_stores() { fn test_accountsdb_scan_snapshot_stores() {
solana_logger::setup();
let (mut storages, raw_expected) = sample_storages_and_accounts(); let (mut storages, raw_expected) = sample_storages_and_accounts();
let bins = 1; let bins = 1;
@ -5832,15 +5828,8 @@ pub mod tests {
// enough stores to get to 2nd chunk // enough stores to get to 2nd chunk
let bins = 1; let bins = 1;
let (_temp_dirs, paths) = get_temp_accounts_paths(1).unwrap();
let slot_expected: Slot = 0;
let size: usize = 123;
let data = AccountStorageEntry::new(&paths[0], slot_expected, 0, size as u64);
let arc = Arc::new(data);
const MAX_ITEMS_PER_CHUNK: usize = 5_000; const MAX_ITEMS_PER_CHUNK: usize = 5_000;
storages[0].splice(0..0, vec![arc; MAX_ITEMS_PER_CHUNK]); storages.splice(0..0, vec![vec![]; MAX_ITEMS_PER_CHUNK]);
let mut stats = HashStats::default(); let mut stats = HashStats::default();
let result = AccountsDb::scan_snapshot_stores( let result = AccountsDb::scan_snapshot_stores(
@ -5935,15 +5924,8 @@ pub mod tests {
// enough stores to get to 2nd chunk // enough stores to get to 2nd chunk
// range is for only 1 bin out of 256. // range is for only 1 bin out of 256.
let bins = 256; let bins = 256;
let (_temp_dirs, paths) = get_temp_accounts_paths(1).unwrap();
let slot_expected: Slot = 0;
let size: usize = 123;
let data = AccountStorageEntry::new(&paths[0], slot_expected, 0, size as u64);
let arc = Arc::new(data);
const MAX_ITEMS_PER_CHUNK: usize = 5_000; const MAX_ITEMS_PER_CHUNK: usize = 5_000;
storages[0].splice(0..0, vec![arc; MAX_ITEMS_PER_CHUNK]); storages.splice(0..0, vec![vec![]; MAX_ITEMS_PER_CHUNK]);
let mut stats = HashStats::default(); let mut stats = HashStats::default();
let result = AccountsDb::scan_snapshot_stores( let result = AccountsDb::scan_snapshot_stores(
@ -6030,7 +6012,6 @@ pub mod tests {
let calls = AtomicU64::new(0); let calls = AtomicU64::new(0);
let result = AccountsDb::scan_account_storage_no_bank( let result = AccountsDb::scan_account_storage_no_bank(
&storages, &storages,
&mut HashStats::default(),
|loaded_account: LoadedAccount, accum: &mut Vec<u64>, slot: Slot| { |loaded_account: LoadedAccount, accum: &mut Vec<u64>, slot: Slot| {
calls.fetch_add(1, Ordering::Relaxed); calls.fetch_add(1, Ordering::Relaxed);
assert_eq!(loaded_account.pubkey(), &pubkey); assert_eq!(loaded_account.pubkey(), &pubkey);

View File

@ -25,7 +25,6 @@ pub struct HashStats {
pub hash_time_total_us: u64, pub hash_time_total_us: u64,
pub sort_time_total_us: u64, pub sort_time_total_us: u64,
pub flatten_time_total_us: u64, pub flatten_time_total_us: u64,
pub pre_scan_flatten_time_total_us: u64,
pub hash_total: usize, pub hash_total: usize,
pub unreduced_entries: usize, pub unreduced_entries: usize,
pub num_snapshot_storage: usize, pub num_snapshot_storage: usize,
@ -36,8 +35,7 @@ impl HashStats {
+ self.zeros_time_total_us + self.zeros_time_total_us
+ self.hash_time_total_us + self.hash_time_total_us
+ self.sort_time_total_us + self.sort_time_total_us
+ self.flatten_time_total_us + self.flatten_time_total_us;
+ self.pre_scan_flatten_time_total_us;
datapoint_info!( datapoint_info!(
"calculate_accounts_hash_without_index", "calculate_accounts_hash_without_index",
("accounts_scan", self.scan_time_total_us, i64), ("accounts_scan", self.scan_time_total_us, i64),
@ -52,11 +50,6 @@ impl HashStats {
self.num_snapshot_storage as i64, self.num_snapshot_storage as i64,
i64 i64
), ),
(
"pre_scan_flatten",
self.pre_scan_flatten_time_total_us as i64,
i64
),
("total", total_time_us as i64, i64), ("total", total_time_us as i64, i64),
); );
} }