More types (#5846)

automerge
This commit is contained in:
sakridge 2019-09-08 11:13:59 -07:00 committed by Grimes
parent 11cec8f24e
commit b35c022629
4 changed files with 28 additions and 75 deletions

View File

@ -5,6 +5,7 @@ use bincode::{deserialize, serialize_into, serialized_size, ErrorKind};
use log::*; use log::*;
use num_derive::{FromPrimitive, ToPrimitive}; use num_derive::{FromPrimitive, ToPrimitive};
use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
use solana_sdk::sysvar::slot_hashes::SlotHash;
use solana_sdk::{ use solana_sdk::{
account::{Account, KeyedAccount}, account::{Account, KeyedAccount},
account_utils::State, account_utils::State,
@ -231,7 +232,7 @@ impl VoteState {
pub fn process_vote( pub fn process_vote(
&mut self, &mut self,
vote: &Vote, vote: &Vote,
slot_hashes: &[(Slot, Hash)], slot_hashes: &[SlotHash],
epoch: Epoch, epoch: Epoch,
) -> Result<(), VoteError> { ) -> Result<(), VoteError> {
if vote.slots.is_empty() { if vote.slots.is_empty() {
@ -407,7 +408,7 @@ pub fn initialize_account(
pub fn process_vote( pub fn process_vote(
vote_account: &mut KeyedAccount, vote_account: &mut KeyedAccount,
slot_hashes: &[(Slot, Hash)], slot_hashes: &[SlotHash],
clock: &Clock, clock: &Clock,
other_signers: &[KeyedAccount], other_signers: &[KeyedAccount],
vote: &Vote, vote: &Vote,
@ -487,7 +488,7 @@ mod tests {
vote_pubkey: &Pubkey, vote_pubkey: &Pubkey,
vote_account: &mut Account, vote_account: &mut Account,
vote: &Vote, vote: &Vote,
slot_hashes: &[(u64, Hash)], slot_hashes: &[SlotHash],
epoch: u64, epoch: u64,
) -> Result<VoteState, InstructionError> { ) -> Result<VoteState, InstructionError> {
process_vote( process_vote(

View File

@ -52,6 +52,13 @@ pub type TransactionCredits = Vec<u64>;
pub type TransactionRents = Vec<u64>; pub type TransactionRents = Vec<u64>;
pub type TransactionLoaders = Vec<Vec<(Pubkey, Account)>>; pub type TransactionLoaders = Vec<Vec<(Pubkey, Account)>>;
pub type TransactionLoadResult = (
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
);
impl Accounts { impl Accounts {
pub fn new(paths: Option<String>) -> Self { pub fn new(paths: Option<String>) -> Self {
let accounts_db = Arc::new(AccountsDB::new(paths)); let accounts_db = Arc::new(AccountsDB::new(paths));
@ -217,14 +224,7 @@ impl Accounts {
hash_queue: &BlockhashQueue, hash_queue: &BlockhashQueue,
error_counters: &mut ErrorCounters, error_counters: &mut ErrorCounters,
rent_collector: &RentCollector, rent_collector: &RentCollector,
) -> Vec< ) -> Vec<Result<TransactionLoadResult>> {
Result<(
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
)>,
> {
//PERF: hold the lock to scan for the references, but not to clone the accounts //PERF: hold the lock to scan for the references, but not to clone the accounts
//TODO: two locks usually leads to deadlocks, should this be one structure? //TODO: two locks usually leads to deadlocks, should this be one structure?
let accounts_index = self.accounts_db.accounts_index.read().unwrap(); let accounts_index = self.accounts_db.accounts_index.read().unwrap();
@ -529,12 +529,7 @@ impl Accounts {
txs: &[Transaction], txs: &[Transaction],
txs_iteration_order: Option<&[usize]>, txs_iteration_order: Option<&[usize]>,
res: &[Result<()>], res: &[Result<()>],
loaded: &mut [Result<( loaded: &mut [Result<TransactionLoadResult>],
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
)>],
) { ) {
let accounts_to_store = let accounts_to_store =
self.collect_accounts_to_store(txs, txs_iteration_order, res, loaded); self.collect_accounts_to_store(txs, txs_iteration_order, res, loaded);
@ -611,12 +606,7 @@ impl Accounts {
txs: &'a [Transaction], txs: &'a [Transaction],
txs_iteration_order: Option<&'a [usize]>, txs_iteration_order: Option<&'a [usize]>,
res: &'a [Result<()>], res: &'a [Result<()>],
loaded: &'a mut [Result<( loaded: &'a mut [Result<TransactionLoadResult>],
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
)>],
) -> Vec<(&'a Pubkey, &'a Account)> { ) -> Vec<(&'a Pubkey, &'a Account)> {
let mut accounts = Vec::new(); let mut accounts = Vec::new();
for (i, (raccs, tx)) in loaded for (i, (raccs, tx)) in loaded
@ -693,14 +683,7 @@ mod tests {
ka: &Vec<(Pubkey, Account)>, ka: &Vec<(Pubkey, Account)>,
fee_calculator: &FeeCalculator, fee_calculator: &FeeCalculator,
error_counters: &mut ErrorCounters, error_counters: &mut ErrorCounters,
) -> Vec< ) -> Vec<Result<TransactionLoadResult>> {
Result<(
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
)>,
> {
let mut hash_queue = BlockhashQueue::new(100); let mut hash_queue = BlockhashQueue::new(100);
hash_queue.register_hash(&tx.message().recent_blockhash, &fee_calculator); hash_queue.register_hash(&tx.message().recent_blockhash, &fee_calculator);
let accounts = Accounts::new(None); let accounts = Accounts::new(None);
@ -726,14 +709,7 @@ mod tests {
tx: Transaction, tx: Transaction,
ka: &Vec<(Pubkey, Account)>, ka: &Vec<(Pubkey, Account)>,
error_counters: &mut ErrorCounters, error_counters: &mut ErrorCounters,
) -> Vec< ) -> Vec<Result<TransactionLoadResult>> {
Result<(
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
)>,
> {
let fee_calculator = FeeCalculator::default(); let fee_calculator = FeeCalculator::default();
load_accounts_with_fee(tx, ka, &fee_calculator, error_counters) load_accounts_with_fee(tx, ka, &fee_calculator, error_counters)
} }

View File

@ -4,9 +4,7 @@
//! already been signed and verified. //! already been signed and verified.
use crate::transaction_utils::OrderedIterator; use crate::transaction_utils::OrderedIterator;
use crate::{ use crate::{
accounts::{ accounts::{Accounts, TransactionLoadResult},
Accounts, TransactionAccounts, TransactionCredits, TransactionLoaders, TransactionRents,
},
accounts_db::{AccountStorageEntry, AccountsDBSerialize, AppendVecId, ErrorCounters}, accounts_db::{AccountStorageEntry, AccountsDBSerialize, AppendVecId, ErrorCounters},
accounts_index::Fork, accounts_index::Fork,
blockhash_queue::BlockhashQueue, blockhash_queue::BlockhashQueue,
@ -797,14 +795,7 @@ impl Bank {
txs_iteration_order: Option<&[usize]>, txs_iteration_order: Option<&[usize]>,
results: Vec<Result<()>>, results: Vec<Result<()>>,
error_counters: &mut ErrorCounters, error_counters: &mut ErrorCounters,
) -> Vec< ) -> Vec<Result<TransactionLoadResult>> {
Result<(
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
)>,
> {
self.rc.accounts.load_accounts( self.rc.accounts.load_accounts(
&self.ancestors, &self.ancestors,
txs, txs,
@ -969,14 +960,7 @@ impl Bank {
lock_results: &LockedAccountsResults, lock_results: &LockedAccountsResults,
max_age: usize, max_age: usize,
) -> ( ) -> (
Vec< Vec<Result<TransactionLoadResult>>,
Result<(
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
)>,
>,
Vec<Result<()>>, Vec<Result<()>>,
Vec<usize>, Vec<usize>,
usize, usize,
@ -1106,12 +1090,7 @@ impl Bank {
&self, &self,
txs: &[Transaction], txs: &[Transaction],
txs_iteration_order: Option<&[usize]>, txs_iteration_order: Option<&[usize]>,
loaded_accounts: &mut [Result<( loaded_accounts: &mut [Result<TransactionLoadResult>],
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
)>],
executed: &[Result<()>], executed: &[Result<()>],
tx_count: usize, tx_count: usize,
signature_count: usize, signature_count: usize,
@ -1391,12 +1370,7 @@ impl Bank {
txs: &[Transaction], txs: &[Transaction],
txs_iteration_order: Option<&[usize]>, txs_iteration_order: Option<&[usize]>,
res: &[Result<()>], res: &[Result<()>],
loaded: &[Result<( loaded: &[Result<TransactionLoadResult>],
TransactionAccounts,
TransactionLoaders,
TransactionCredits,
TransactionRents,
)>],
) { ) {
for (i, (raccs, tx)) in loaded for (i, (raccs, tx)) in loaded
.iter() .iter()
@ -1415,7 +1389,7 @@ impl Bank {
.account_keys .account_keys
.iter() .iter()
.zip(acc.0.iter()) .zip(acc.0.iter())
.filter(|(_, account)| { .filter(|(_key, account)| {
(Stakes::is_stake(account)) || storage_utils::is_storage(account) (Stakes::is_stake(account)) || storage_utils::is_storage(account)
}) })
{ {

View File

@ -19,8 +19,10 @@ crate::solana_name_id!(ID, "SysvarS1otHashes111111111111111111111111111");
pub const MAX_SLOT_HASHES: usize = 512; // 512 slots to get your vote in pub const MAX_SLOT_HASHES: usize = 512; // 512 slots to get your vote in
pub type SlotHash = (Slot, Hash);
#[derive(Serialize, Deserialize, PartialEq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Debug)]
pub struct SlotHashes(Vec<(Slot, Hash)>); pub struct SlotHashes(Vec<SlotHash>);
impl SlotHashes { impl SlotHashes {
pub fn from(account: &Account) -> Option<Self> { pub fn from(account: &Account) -> Option<Self> {
@ -46,19 +48,19 @@ impl SlotHashes {
.ok() .ok()
.map(|index| &self[index].1) .map(|index| &self[index].1)
} }
pub fn new(slot_hashes: &[(Slot, Hash)]) -> Self { pub fn new(slot_hashes: &[SlotHash]) -> Self {
Self(slot_hashes.to_vec()) Self(slot_hashes.to_vec())
} }
} }
impl Deref for SlotHashes { impl Deref for SlotHashes {
type Target = Vec<(u64, Hash)>; type Target = Vec<SlotHash>;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
&self.0 &self.0
} }
} }
pub fn create_account(lamports: u64, slot_hashes: &[(Slot, Hash)]) -> Account { pub fn create_account(lamports: u64, slot_hashes: &[SlotHash]) -> Account {
let mut account = Account::new(lamports, SlotHashes::size_of(), &sysvar::id()); let mut account = Account::new(lamports, SlotHashes::size_of(), &sysvar::id());
SlotHashes::new(slot_hashes).to(&mut account).unwrap(); SlotHashes::new(slot_hashes).to(&mut account).unwrap();
account account