Co-authored-by: Carl Lin <carl@solana.com>
(cherry picked from commit 5dceddd21d
)
Co-authored-by: carllin <wumu727@gmail.com>
This commit is contained in:
@ -1,8 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
accounts_db::{
|
accounts_db::{AccountsDB, AppendVecId, BankHashInfo, ErrorCounters},
|
||||||
AccountInfo, AccountStorage, AccountsDB, AppendVecId, BankHashInfo, ErrorCounters,
|
accounts_index::Ancestors,
|
||||||
},
|
|
||||||
accounts_index::{AccountsIndex, Ancestors},
|
|
||||||
append_vec::StoredAccount,
|
append_vec::StoredAccount,
|
||||||
bank::{
|
bank::{
|
||||||
NonceRollbackFull, NonceRollbackInfo, TransactionCheckResult, TransactionExecutionResult,
|
NonceRollbackFull, NonceRollbackInfo, TransactionCheckResult, TransactionExecutionResult,
|
||||||
@ -130,9 +128,7 @@ impl Accounts {
|
|||||||
|
|
||||||
fn load_tx_accounts(
|
fn load_tx_accounts(
|
||||||
&self,
|
&self,
|
||||||
storage: &AccountStorage,
|
|
||||||
ancestors: &Ancestors,
|
ancestors: &Ancestors,
|
||||||
accounts_index: &AccountsIndex<AccountInfo>,
|
|
||||||
tx: &Transaction,
|
tx: &Transaction,
|
||||||
fee: u64,
|
fee: u64,
|
||||||
error_counters: &mut ErrorCounters,
|
error_counters: &mut ErrorCounters,
|
||||||
@ -165,12 +161,12 @@ impl Accounts {
|
|||||||
}
|
}
|
||||||
Self::construct_instructions_account(message)
|
Self::construct_instructions_account(message)
|
||||||
} else {
|
} else {
|
||||||
let (account, rent) =
|
let (account, rent) = self
|
||||||
AccountsDB::load(storage, ancestors, accounts_index, key)
|
.accounts_db
|
||||||
|
.load(ancestors, key)
|
||||||
.map(|(mut account, _)| {
|
.map(|(mut account, _)| {
|
||||||
if message.is_writable(i) {
|
if message.is_writable(i) {
|
||||||
let rent_due = rent_collector
|
let rent_due = rent_collector.collect_from_existing_account(
|
||||||
.collect_from_existing_account(
|
|
||||||
&key,
|
&key,
|
||||||
&mut account,
|
&mut account,
|
||||||
rent_fix_enabled,
|
rent_fix_enabled,
|
||||||
@ -228,9 +224,8 @@ impl Accounts {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn load_executable_accounts(
|
fn load_executable_accounts(
|
||||||
storage: &AccountStorage,
|
&self,
|
||||||
ancestors: &Ancestors,
|
ancestors: &Ancestors,
|
||||||
accounts_index: &AccountsIndex<AccountInfo>,
|
|
||||||
program_id: &Pubkey,
|
program_id: &Pubkey,
|
||||||
error_counters: &mut ErrorCounters,
|
error_counters: &mut ErrorCounters,
|
||||||
) -> Result<Vec<(Pubkey, Account)>> {
|
) -> Result<Vec<(Pubkey, Account)>> {
|
||||||
@ -249,7 +244,9 @@ impl Accounts {
|
|||||||
}
|
}
|
||||||
depth += 1;
|
depth += 1;
|
||||||
|
|
||||||
let program = match AccountsDB::load(storage, ancestors, accounts_index, &program_id)
|
let program = match self
|
||||||
|
.accounts_db
|
||||||
|
.load(ancestors, &program_id)
|
||||||
.map(|(account, _)| account)
|
.map(|(account, _)| account)
|
||||||
{
|
{
|
||||||
Some(program) => program,
|
Some(program) => program,
|
||||||
@ -273,9 +270,8 @@ impl Accounts {
|
|||||||
|
|
||||||
/// For each program_id in the transaction, load its loaders.
|
/// For each program_id in the transaction, load its loaders.
|
||||||
fn load_loaders(
|
fn load_loaders(
|
||||||
storage: &AccountStorage,
|
&self,
|
||||||
ancestors: &Ancestors,
|
ancestors: &Ancestors,
|
||||||
accounts_index: &AccountsIndex<AccountInfo>,
|
|
||||||
tx: &Transaction,
|
tx: &Transaction,
|
||||||
error_counters: &mut ErrorCounters,
|
error_counters: &mut ErrorCounters,
|
||||||
) -> Result<TransactionLoaders> {
|
) -> Result<TransactionLoaders> {
|
||||||
@ -289,13 +285,7 @@ impl Accounts {
|
|||||||
return Err(TransactionError::AccountNotFound);
|
return Err(TransactionError::AccountNotFound);
|
||||||
}
|
}
|
||||||
let program_id = message.account_keys[ix.program_id_index as usize];
|
let program_id = message.account_keys[ix.program_id_index as usize];
|
||||||
Self::load_executable_accounts(
|
self.load_executable_accounts(ancestors, &program_id, error_counters)
|
||||||
storage,
|
|
||||||
ancestors,
|
|
||||||
accounts_index,
|
|
||||||
&program_id,
|
|
||||||
error_counters,
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
@ -311,8 +301,6 @@ impl Accounts {
|
|||||||
rent_collector: &RentCollector,
|
rent_collector: &RentCollector,
|
||||||
feature_set: &FeatureSet,
|
feature_set: &FeatureSet,
|
||||||
) -> Vec<TransactionLoadResult> {
|
) -> Vec<TransactionLoadResult> {
|
||||||
let accounts_index = &self.accounts_db.accounts_index;
|
|
||||||
|
|
||||||
let fee_config = FeeConfig {
|
let fee_config = FeeConfig {
|
||||||
secp256k1_program_enabled: feature_set
|
secp256k1_program_enabled: feature_set
|
||||||
.is_active(&feature_set::secp256k1_program_enabled::id()),
|
.is_active(&feature_set::secp256k1_program_enabled::id()),
|
||||||
@ -336,9 +324,7 @@ impl Accounts {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let load_res = self.load_tx_accounts(
|
let load_res = self.load_tx_accounts(
|
||||||
&self.accounts_db.storage,
|
|
||||||
ancestors,
|
ancestors,
|
||||||
accounts_index,
|
|
||||||
tx,
|
tx,
|
||||||
fee,
|
fee,
|
||||||
error_counters,
|
error_counters,
|
||||||
@ -350,13 +336,7 @@ impl Accounts {
|
|||||||
Err(e) => return (Err(e), None),
|
Err(e) => return (Err(e), None),
|
||||||
};
|
};
|
||||||
|
|
||||||
let load_res = Self::load_loaders(
|
let load_res = self.load_loaders(ancestors, tx, error_counters);
|
||||||
&self.accounts_db.storage,
|
|
||||||
ancestors,
|
|
||||||
accounts_index,
|
|
||||||
tx,
|
|
||||||
error_counters,
|
|
||||||
);
|
|
||||||
let loaders = match load_res {
|
let loaders = match load_res {
|
||||||
Ok(loaders) => loaders,
|
Ok(loaders) => loaders,
|
||||||
Err(e) => return (Err(e), None),
|
Err(e) => return (Err(e), None),
|
||||||
@ -1549,10 +1529,8 @@ mod tests {
|
|||||||
let ancestors = vec![(0, 0)].into_iter().collect();
|
let ancestors = vec![(0, 0)].into_iter().collect();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Accounts::load_executable_accounts(
|
accounts.load_executable_accounts(
|
||||||
&accounts.accounts_db.storage,
|
|
||||||
&ancestors,
|
&ancestors,
|
||||||
&accounts.accounts_db.accounts_index,
|
|
||||||
&solana_sdk::pubkey::new_rand(),
|
&solana_sdk::pubkey::new_rand(),
|
||||||
&mut error_counters
|
&mut error_counters
|
||||||
),
|
),
|
||||||
|
@ -1333,14 +1333,9 @@ impl AccountsDB {
|
|||||||
bank_hashes.insert(slot, new_hash_info);
|
bank_hashes.insert(slot, new_hash_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load(
|
pub fn load(&self, ancestors: &Ancestors, pubkey: &Pubkey) -> Option<(Account, Slot)> {
|
||||||
storage: &AccountStorage,
|
|
||||||
ancestors: &Ancestors,
|
|
||||||
accounts_index: &AccountsIndex<AccountInfo>,
|
|
||||||
pubkey: &Pubkey,
|
|
||||||
) -> Option<(Account, Slot)> {
|
|
||||||
let (slot, store_id, offset) = {
|
let (slot, store_id, offset) = {
|
||||||
let (lock, index) = accounts_index.get(pubkey, Some(ancestors), None)?;
|
let (lock, index) = self.accounts_index.get(pubkey, Some(ancestors), None)?;
|
||||||
let slot_list = lock.slot_list();
|
let slot_list = lock.slot_list();
|
||||||
let (
|
let (
|
||||||
slot,
|
slot,
|
||||||
@ -1353,7 +1348,7 @@ impl AccountsDB {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//TODO: thread this as a ref
|
//TODO: thread this as a ref
|
||||||
storage
|
self.storage
|
||||||
.get_account_storage_entry(slot, store_id)
|
.get_account_storage_entry(slot, store_id)
|
||||||
.and_then(|store| {
|
.and_then(|store| {
|
||||||
store
|
store
|
||||||
@ -1390,7 +1385,7 @@ impl AccountsDB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_slow(&self, ancestors: &Ancestors, pubkey: &Pubkey) -> Option<(Account, Slot)> {
|
pub fn load_slow(&self, ancestors: &Ancestors, pubkey: &Pubkey) -> Option<(Account, Slot)> {
|
||||||
Self::load(&self.storage, ancestors, &self.accounts_index, pubkey)
|
self.load(ancestors, pubkey)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_account_from_storage(&self, slot: Slot, account_info: &AccountInfo) -> Option<Account> {
|
fn get_account_from_storage(&self, slot: Slot, account_info: &AccountInfo) -> Option<Account> {
|
||||||
|
Reference in New Issue
Block a user