From 9918539229dd74a8e0ce03912f10460c8c5d22a2 Mon Sep 17 00:00:00 2001 From: Ryo Onodera Date: Mon, 27 Apr 2020 11:07:03 +0900 Subject: [PATCH] Introduce type alias Ancestors (#9699) * Introduce type alias AncestorList * Rename AncestorList => Ancestors --- accounts-bench/src/main.rs | 8 +++++--- runtime/src/accounts.rs | 30 +++++++++++------------------- runtime/src/accounts_db.rs | 28 ++++++++++------------------ runtime/src/accounts_index.rs | 8 +++++--- runtime/src/bank.rs | 7 ++++--- runtime/src/status_cache.rs | 6 ++++-- 6 files changed, 39 insertions(+), 48 deletions(-) diff --git a/accounts-bench/src/main.rs b/accounts-bench/src/main.rs index 2a69df223e..82dfbd3254 100644 --- a/accounts-bench/src/main.rs +++ b/accounts-bench/src/main.rs @@ -1,9 +1,11 @@ use clap::{value_t, App, Arg}; use rayon::prelude::*; use solana_measure::measure::Measure; -use solana_runtime::accounts::{create_test_accounts, update_accounts, Accounts}; +use solana_runtime::{ + accounts::{create_test_accounts, update_accounts, Accounts}, + accounts_index::Ancestors, +}; use solana_sdk::pubkey::Pubkey; -use std::collections::HashMap; use std::fs; use std::path::PathBuf; @@ -76,7 +78,7 @@ fn main() { num_slots, create_time ); - let mut ancestors: HashMap = vec![(0, 0)].into_iter().collect(); + let mut ancestors: Ancestors = vec![(0, 0)].into_iter().collect(); for i in 1..num_slots { ancestors.insert(i as u64, i - 1); accounts.add_root(i as u64); diff --git a/runtime/src/accounts.rs b/runtime/src/accounts.rs index a2b684b0ef..e693c3d9ce 100644 --- a/runtime/src/accounts.rs +++ b/runtime/src/accounts.rs @@ -2,7 +2,7 @@ use crate::{ accounts_db::{ AccountInfo, AccountStorage, AccountsDB, AppendVecId, BankHashInfo, ErrorCounters, }, - accounts_index::AccountsIndex, + accounts_index::{AccountsIndex, Ancestors}, append_vec::StoredAccount, bank::{HashAgeKind, TransactionProcessResult}, blockhash_queue::BlockhashQueue, @@ -77,7 +77,7 @@ impl Accounts { pub fn new_with_frozen_accounts( paths: Vec, - ancestors: &HashMap, + ancestors: &Ancestors, frozen_account_pubkeys: &[Pubkey], ) -> Self { let mut accounts = Accounts { @@ -90,11 +90,7 @@ impl Accounts { accounts } - pub fn freeze_accounts( - &mut self, - ancestors: &HashMap, - frozen_account_pubkeys: &[Pubkey], - ) { + pub fn freeze_accounts(&mut self, ancestors: &Ancestors, frozen_account_pubkeys: &[Pubkey]) { Arc::get_mut(&mut self.accounts_db) .unwrap() .freeze_accounts(ancestors, frozen_account_pubkeys); @@ -102,7 +98,7 @@ impl Accounts { pub fn from_stream>( account_paths: &[PathBuf], - ancestors: &HashMap, + ancestors: &Ancestors, frozen_account_pubkeys: &[Pubkey], stream: &mut BufReader, stream_append_vecs_path: P, @@ -135,7 +131,7 @@ impl Accounts { fn load_tx_accounts( &self, storage: &AccountStorage, - ancestors: &HashMap, + ancestors: &Ancestors, accounts_index: &AccountsIndex, tx: &Transaction, fee: u64, @@ -205,7 +201,7 @@ impl Accounts { fn load_executable_accounts( storage: &AccountStorage, - ancestors: &HashMap, + ancestors: &Ancestors, accounts_index: &AccountsIndex, program_id: &Pubkey, error_counters: &mut ErrorCounters, @@ -250,7 +246,7 @@ impl Accounts { /// For each program_id in the transaction, load its loaders. fn load_loaders( storage: &AccountStorage, - ancestors: &HashMap, + ancestors: &Ancestors, accounts_index: &AccountsIndex, tx: &Transaction, error_counters: &mut ErrorCounters, @@ -278,7 +274,7 @@ impl Accounts { pub fn load_accounts( &self, - ancestors: &HashMap, + ancestors: &Ancestors, txs: &[Transaction], txs_iteration_order: Option<&[usize]>, lock_results: Vec, @@ -342,11 +338,7 @@ impl Accounts { } /// Slow because lock is held for 1 operation instead of many - pub fn load_slow( - &self, - ancestors: &HashMap, - pubkey: &Pubkey, - ) -> Option<(Account, Slot)> { + pub fn load_slow(&self, ancestors: &Ancestors, pubkey: &Pubkey) -> Option<(Account, Slot)> { let (account, slot) = self .accounts_db .load_slow(ancestors, pubkey) @@ -404,7 +396,7 @@ impl Accounts { } #[must_use] - pub fn verify_bank_hash(&self, slot: Slot, ancestors: &HashMap) -> bool { + pub fn verify_bank_hash(&self, slot: Slot, ancestors: &Ancestors) -> bool { if let Err(err) = self.accounts_db.verify_bank_hash(slot, ancestors) { warn!("verify_bank_hash failed: {:?}", err); false @@ -415,7 +407,7 @@ impl Accounts { pub fn load_by_program( &self, - ancestors: &HashMap, + ancestors: &Ancestors, program_id: Option<&Pubkey>, ) -> Vec<(Pubkey, Account)> { self.accounts_db.scan_accounts( diff --git a/runtime/src/accounts_db.rs b/runtime/src/accounts_db.rs index 290173bfb4..c3027b22b2 100644 --- a/runtime/src/accounts_db.rs +++ b/runtime/src/accounts_db.rs @@ -19,7 +19,7 @@ //! commit for each slot entry would be indexed. use crate::{ - accounts_index::{AccountsIndex, SlotList, SlotSlice}, + accounts_index::{AccountsIndex, Ancestors, SlotList, SlotSlice}, append_vec::{AppendVec, StoredAccount, StoredMeta}, bank::deserialize_from_snapshot, }; @@ -1083,7 +1083,7 @@ impl AccountsDB { } } - pub fn scan_accounts(&self, ancestors: &HashMap, scan_func: F) -> A + pub fn scan_accounts(&self, ancestors: &Ancestors, scan_func: F) -> A where F: Fn(&mut A, Option<(&Pubkey, Account, Slot)>) -> (), A: Default, @@ -1165,7 +1165,7 @@ impl AccountsDB { pub fn load( storage: &AccountStorage, - ancestors: &HashMap, + ancestors: &Ancestors, accounts_index: &AccountsIndex, pubkey: &Pubkey, ) -> Option<(Account, Slot)> { @@ -1183,11 +1183,7 @@ impl AccountsDB { } } - pub fn load_slow( - &self, - ancestors: &HashMap, - pubkey: &Pubkey, - ) -> Option<(Account, Slot)> { + pub fn load_slow(&self, ancestors: &Ancestors, pubkey: &Pubkey) -> Option<(Account, Slot)> { let accounts_index = self.accounts_index.read().unwrap(); let storage = self.storage.read().unwrap(); Self::load(&storage, ancestors, &accounts_index, pubkey) @@ -1540,7 +1536,7 @@ impl AccountsDB { fn calculate_accounts_hash( &self, - ancestors: &HashMap, + ancestors: &Ancestors, check_hash: bool, ) -> Result { use BankHashVerificationError::*; @@ -1598,7 +1594,7 @@ impl AccountsDB { bank_hash_info.snapshot_hash } - pub fn update_accounts_hash(&self, slot: Slot, ancestors: &HashMap) -> Hash { + pub fn update_accounts_hash(&self, slot: Slot, ancestors: &Ancestors) -> Hash { let hash = self.calculate_accounts_hash(ancestors, false).unwrap(); let mut bank_hashes = self.bank_hashes.write().unwrap(); let mut bank_hash_info = bank_hashes.get_mut(&slot).unwrap(); @@ -1609,7 +1605,7 @@ impl AccountsDB { pub fn verify_bank_hash( &self, slot: Slot, - ancestors: &HashMap, + ancestors: &Ancestors, ) -> Result<(), BankHashVerificationError> { use BankHashVerificationError::*; @@ -1806,11 +1802,7 @@ impl AccountsDB { hashes } - pub fn freeze_accounts( - &mut self, - ancestors: &HashMap, - account_pubkeys: &[Pubkey], - ) { + pub fn freeze_accounts(&mut self, ancestors: &Ancestors, account_pubkeys: &[Pubkey]) { for account_pubkey in account_pubkeys { if let Some((account, _slot)) = self.load_slow(ancestors, &account_pubkey) { let frozen_account_info = FrozenAccountInfo { @@ -2011,8 +2003,8 @@ pub mod tests { use std::{fs, str::FromStr}; use tempfile::TempDir; - fn linear_ancestors(end_slot: u64) -> HashMap { - let mut ancestors: HashMap = vec![(0, 0)].into_iter().collect(); + fn linear_ancestors(end_slot: u64) -> Ancestors { + let mut ancestors: Ancestors = vec![(0, 0)].into_iter().collect(); for i in 1..end_slot { ancestors.insert(i, (i - 1) as usize); } diff --git a/runtime/src/accounts_index.rs b/runtime/src/accounts_index.rs index 314e78fc76..d24cdfff52 100644 --- a/runtime/src/accounts_index.rs +++ b/runtime/src/accounts_index.rs @@ -7,6 +7,8 @@ use std::{ pub type SlotList = Vec<(Slot, T)>; pub type SlotSlice<'s, T> = &'s [(Slot, T)]; +pub type Ancestors = HashMap; + pub type RefCount = u64; type AccountMapEntry = (AtomicU64, RwLock>); @@ -20,7 +22,7 @@ pub struct AccountsIndex { impl AccountsIndex { /// call func with every pubkey and index visible from a given set of ancestors - pub fn scan_accounts(&self, ancestors: &HashMap, mut func: F) + pub fn scan_accounts(&self, ancestors: &Ancestors, mut func: F) where F: FnMut(&Pubkey, (&T, Slot)) -> (), { @@ -56,7 +58,7 @@ impl AccountsIndex { // find the latest slot and T in a slice for a given ancestor // returns index into 'slice' if found, None if not. - fn latest_slot(&self, ancestors: &HashMap, slice: SlotSlice) -> Option { + fn latest_slot(&self, ancestors: &Ancestors, slice: SlotSlice) -> Option { let mut max = 0; let mut rv = None; for (i, (slot, _t)) in slice.iter().rev().enumerate() { @@ -73,7 +75,7 @@ impl AccountsIndex { pub fn get( &self, pubkey: &Pubkey, - ancestors: &HashMap, + ancestors: &Ancestors, ) -> Option<(RwLockReadGuard>, usize)> { self.account_maps.get(pubkey).and_then(|list| { let list_r = list.1.read().unwrap(); diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 7a56b7909e..0bcdaecaf6 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -5,6 +5,7 @@ use crate::{ accounts::{Accounts, TransactionAccounts, TransactionLoadResult, TransactionLoaders}, accounts_db::{AccountsDBSerialize, ErrorCounters, SnapshotStorage, SnapshotStorages}, + accounts_index::Ancestors, blockhash_queue::BlockhashQueue, epoch_stakes::{EpochStakes, NodeVoteAccounts}, message_processor::{MessageProcessor, ProcessInstruction}, @@ -90,7 +91,7 @@ impl BankRc { pub fn from_stream>( account_paths: &[PathBuf], slot: Slot, - ancestors: &HashMap, + ancestors: &Ancestors, frozen_account_pubkeys: &[Pubkey], mut stream: &mut BufReader, stream_append_vecs_path: P, @@ -227,7 +228,7 @@ pub struct Bank { blockhash_queue: RwLock, /// The set of parents including this bank - pub ancestors: HashMap, + pub ancestors: Ancestors, /// Hash of this Bank's state. Only meaningful after freezing. hash: RwLock, @@ -1818,7 +1819,7 @@ impl Bank { } pub fn get_account_modified_since_parent(&self, pubkey: &Pubkey) -> Option<(Account, Slot)> { - let just_self: HashMap = vec![(self.slot(), 0)].into_iter().collect(); + let just_self: Ancestors = vec![(self.slot(), 0)].into_iter().collect(); if let Some((account, slot)) = self.rc.accounts.load_slow(&just_self, pubkey) { if slot == self.slot() { return Some((account, slot)); diff --git a/runtime/src/status_cache.rs b/runtime/src/status_cache.rs index b6ae088965..4885e5c5c5 100644 --- a/runtime/src/status_cache.rs +++ b/runtime/src/status_cache.rs @@ -1,3 +1,5 @@ +use crate::accounts_index::Ancestors; + use log::*; use rand::{thread_rng, Rng}; use serde::Serialize; @@ -85,7 +87,7 @@ impl StatusCache { &self, sig: &Signature, transaction_blockhash: &Hash, - ancestors: &HashMap, + ancestors: &Ancestors, ) -> Option<(Slot, T)> { let map = self.cache.get(transaction_blockhash)?; let (_, index, sigmap) = map; @@ -106,7 +108,7 @@ impl StatusCache { pub fn get_signature_slot( &self, signature: &Signature, - ancestors: &HashMap, + ancestors: &Ancestors, ) -> Option<(Slot, T)> { let mut keys = vec![]; let mut val: Vec<_> = self.cache.iter().map(|(k, _)| *k).collect();