Struct solana_runtime::accounts_db::AccountsDb
source · pub struct AccountsDb {Show 16 fields
pub accounts_index: AccountsIndex<AccountInfo, AccountInfo>,
pub ancient_append_vec_offset: Option<i64>,
pub skip_initial_hash_calc: bool,
pub accounts_cache: AccountsCache,
pub next_id: AtomicAppendVecId,
pub shrink_candidate_slots: Mutex<HashMap<Slot, Arc<AccountStorageEntry>>>,
pub shrink_paths: RwLock<Option<Vec<PathBuf>>>,
pub thread_pool: ThreadPool,
pub thread_pool_clean: ThreadPool,
pub stats: AccountsStats,
pub cluster_type: Option<ClusterType>,
pub account_indexes: AccountSecondaryIndexes,
pub filler_account_suffix: Option<Pubkey>,
pub filler_accounts_per_slot: AtomicU64,
pub filler_account_slots_remaining: AtomicU64,
pub epoch_accounts_hash_manager: EpochAccountsHashManager,
/* private fields */
}
Fields§
§accounts_index: AccountsIndex<AccountInfo, AccountInfo>
Keeps tracks of index into AppendVec on a per slot basis
ancient_append_vec_offset: Option<i64>
Some(offset) iff we want to squash old append vecs together into ‘ancient append vecs’ Some(offset) means for slots up to (max_slot - (slots_per_epoch - ‘offset’)), put them in ancient append vecs
skip_initial_hash_calc: bool
true iff we want to skip the initial hash calculation on startup
accounts_cache: AccountsCache
§next_id: AtomicAppendVecId
distribute the accounts across storage lists
shrink_candidate_slots: Mutex<HashMap<Slot, Arc<AccountStorageEntry>>>
Set of shrinkable stores organized by map of slot to append_vec_id
shrink_paths: RwLock<Option<Vec<PathBuf>>>
§thread_pool: ThreadPool
Thread pool used for par_iter
thread_pool_clean: ThreadPool
§stats: AccountsStats
§cluster_type: Option<ClusterType>
§account_indexes: AccountSecondaryIndexes
§filler_account_suffix: Option<Pubkey>
§filler_accounts_per_slot: AtomicU64
number of filler accounts to add for each slot
filler_account_slots_remaining: AtomicU64
number of slots remaining where filler accounts should be added
epoch_accounts_hash_manager: EpochAccountsHashManager
the full accounts hash calculation as of a predetermined block height ‘N’ to be included in the bank hash at a predetermined block height ‘M’ The cadence is once per epoch, all nodes calculate a full accounts hash as of a known slot calculated using ‘N’ Some time later (to allow for slow calculation time), the bank hash at a slot calculated using ‘M’ includes the full accounts hash. Thus, the state of all accounts on a validator is known to be correct at least once per epoch.
Implementations§
source§impl AccountsDb
impl AccountsDb
sourcepub fn notify_account_restore_from_snapshot(&self)
pub fn notify_account_restore_from_snapshot(&self)
Notify the plugins of of account data when AccountsDb is restored from a snapshot. The data is streamed in the reverse order of the slots so that an account is only streamed once. At a slot, if the accounts is updated multiple times only the last write (with highest write_version) is notified.
pub fn notify_account_at_accounts_update<P>( &self, slot: Slot, account: &AccountSharedData, txn: &Option<&SanitizedTransaction>, pubkey: &Pubkey, write_version_producer: &mut P )where P: Iterator<Item = u64>,
source§impl AccountsDb
impl AccountsDb
pub const ACCOUNTS_HASH_CACHE_DIR: &str = "accounts_hash_cache"
pub fn default_for_tests() -> Self
pub fn new_for_tests(paths: Vec<PathBuf>, cluster_type: &ClusterType) -> Self
pub fn new_for_tests_with_caching( paths: Vec<PathBuf>, cluster_type: &ClusterType ) -> Self
pub fn new_with_config( paths: Vec<PathBuf>, cluster_type: &ClusterType, account_indexes: AccountSecondaryIndexes, shrink_ratio: AccountShrinkThreshold, accounts_db_config: Option<AccountsDbConfig>, accounts_update_notifier: Option<AccountsUpdateNotifier>, exit: &Arc<AtomicBool> ) -> Self
pub fn set_shrink_paths(&self, paths: Vec<PathBuf>)
pub fn file_size(&self) -> u64
pub fn new_single_for_tests() -> Self
pub fn new_single_for_tests_with_caching() -> Self
pub fn new_single_for_tests_with_secondary_indexes( secondary_indexes: AccountSecondaryIndexes ) -> Self
pub fn expected_cluster_type(&self) -> ClusterType
sourcepub fn clean_accounts_for_tests(&self)
pub fn clean_accounts_for_tests(&self)
Call clean_accounts() with the common parameters that tests/benches use.
pub fn clean_accounts( &self, max_clean_root_inclusive: Option<Slot>, is_startup: bool, last_full_snapshot_slot: Option<Slot>, epoch_schedule: &EpochSchedule )
pub fn shrink_candidate_slots(&self, epoch_schedule: &EpochSchedule) -> usize
pub fn shrink_all_slots( &self, is_startup: bool, last_full_snapshot_slot: Option<Slot>, epoch_schedule: &EpochSchedule )
pub fn scan_accounts<F>( &self, ancestors: &Ancestors, bank_id: BankId, scan_func: F, config: &ScanConfig ) -> ScanResult<()>where F: FnMut(Option<(&Pubkey, AccountSharedData, Slot)>),
pub fn unchecked_scan_accounts<F>( &self, metric_name: &'static str, ancestors: &Ancestors, scan_func: F, config: &ScanConfig )where F: FnMut(&Pubkey, LoadedAccount<'_>, Slot),
sourcepub fn range_scan_accounts<F, R>(
&self,
metric_name: &'static str,
ancestors: &Ancestors,
range: R,
config: &ScanConfig,
scan_func: F
)where
F: FnMut(Option<(&Pubkey, AccountSharedData, Slot)>),
R: RangeBounds<Pubkey> + Debug,
pub fn range_scan_accounts<F, R>( &self, metric_name: &'static str, ancestors: &Ancestors, range: R, config: &ScanConfig, scan_func: F )where F: FnMut(Option<(&Pubkey, AccountSharedData, Slot)>), R: RangeBounds<Pubkey> + Debug,
Only guaranteed to be safe when called from rent collection
pub fn index_scan_accounts<F>( &self, ancestors: &Ancestors, bank_id: BankId, index_key: IndexKey, scan_func: F, config: &ScanConfig ) -> ScanResult<bool>where F: FnMut(Option<(&Pubkey, AccountSharedData, Slot)>),
sourcepub fn scan_account_storage<R, B>(
&self,
slot: Slot,
cache_map_func: impl Fn(LoadedAccount<'_>) -> Option<R> + Sync,
storage_scan_func: impl Fn(&B, LoadedAccount<'_>) + Sync
) -> ScanStorageResult<R, B>where
R: Send,
B: Send + Default + Sync,
pub fn scan_account_storage<R, B>( &self, slot: Slot, cache_map_func: impl Fn(LoadedAccount<'_>) -> Option<R> + Sync, storage_scan_func: impl Fn(&B, LoadedAccount<'_>) + Sync ) -> ScanStorageResult<R, B>where R: Send, B: Send + Default + Sync,
Scan a specific slot through all the account storage
pub fn load( &self, ancestors: &Ancestors, pubkey: &Pubkey, load_hint: LoadHint ) -> Option<(AccountSharedData, Slot)>
sourcepub fn account_matches_owners(
&self,
ancestors: &Ancestors,
account: &Pubkey,
owners: &[&Pubkey]
) -> Result<usize, MatchAccountOwnerError>
pub fn account_matches_owners( &self, ancestors: &Ancestors, account: &Pubkey, owners: &[&Pubkey] ) -> Result<usize, MatchAccountOwnerError>
Return Ok(index_of_matching_owner) if the account owner at offset
is one of the pubkeys in owners
.
Return Err(MatchAccountOwnerError::NoMatch) if the account has 0 lamports or the owner is not one of
the pubkeys in owners
.
Return Err(MatchAccountOwnerError::UnableToLoad) if the account could not be accessed.
pub fn load_account_into_read_cache( &self, ancestors: &Ancestors, pubkey: &Pubkey )
sourcepub fn load_with_fixed_root(
&self,
ancestors: &Ancestors,
pubkey: &Pubkey
) -> Option<(AccountSharedData, Slot)>
pub fn load_with_fixed_root( &self, ancestors: &Ancestors, pubkey: &Pubkey ) -> Option<(AccountSharedData, Slot)>
note this returns None for accounts with zero lamports
sourcepub fn flush_read_only_cache_for_tests(&self)
pub fn flush_read_only_cache_for_tests(&self)
remove all entries from the read only accounts cache useful for benches/tests
pub fn load_account_hash( &self, ancestors: &Ancestors, pubkey: &Pubkey, max_root: Option<Slot>, load_hint: LoadHint ) -> Option<Hash>
pub fn create_drop_bank_callback( &self, pruned_banks_sender: DroppedSlotsSender ) -> SendDroppedBankCallback
sourcepub fn purge_slot(
&self,
slot: Slot,
bank_id: BankId,
is_serialized_with_abs: bool
)
pub fn purge_slot( &self, slot: Slot, bank_id: BankId, is_serialized_with_abs: bool )
This should only be called after the Bank::drop()
runs in bank.rs, See BANK_DROP_SAFETY
comment below for more explanation.
is_serialized_with_abs
- indicates whehter this call runs sequentially with all other accounts_db relevant calls, such as shrinking, purging etc., in account background service.
pub fn remove_unrooted_slots(&self, remove_slots: &[(Slot, BankId)])
pub fn hash_account<T: ReadableAccount>( slot: Slot, account: &T, pubkey: &Pubkey, include_slot: IncludeSlotInHash ) -> Hash
pub fn mark_slot_frozen(&self, slot: Slot)
pub fn expire_old_recycle_stores(&self)
pub fn flush_accounts_cache( &self, force_flush: bool, requested_flush_root: Option<Slot> )
pub fn checked_iterative_sum_for_capitalization( total_cap: u64, new_cap: u64 ) -> u64
pub fn checked_sum_for_capitalization<T: Iterator<Item = u64>>( balances: T ) -> u64
pub fn calculate_accounts_hash_from_index( &self, max_slot: Slot, config: &CalcAccountsHashConfig<'_> ) -> Result<(AccountsHash, u64), AccountsHashVerificationError>
pub fn update_accounts_hash_for_tests( &self, slot: Slot, ancestors: &Ancestors, debug_verify: bool, is_startup: bool ) -> (AccountsHash, u64)
pub fn update_accounts_hash( &self, data_source: CalcAccountsHashDataSource, debug_verify: bool, slot: Slot, ancestors: &Ancestors, expected_capitalization: Option<u64>, epoch_schedule: &EpochSchedule, rent_collector: &RentCollector, is_startup: bool, include_slot_in_hash: IncludeSlotInHash ) -> (AccountsHash, u64)
sourcepub fn update_incremental_accounts_hash(
&self,
config: &CalcAccountsHashConfig<'_>,
storages: &SortedStorages<'_>,
slot: Slot,
stats: HashStats
) -> Result<(IncrementalAccountsHash, u64), AccountsHashVerificationError>
pub fn update_incremental_accounts_hash( &self, config: &CalcAccountsHashConfig<'_>, storages: &SortedStorages<'_>, slot: Slot, stats: HashStats ) -> Result<(IncrementalAccountsHash, u64), AccountsHashVerificationError>
Calculate the incremental accounts hash for storages
and save the results at slot
sourcepub fn set_accounts_hash(
&self,
slot: Slot,
accounts_hash: (AccountsHash, u64)
) -> Option<(AccountsHash, u64)>
pub fn set_accounts_hash( &self, slot: Slot, accounts_hash: (AccountsHash, u64) ) -> Option<(AccountsHash, u64)>
Set the accounts hash for slot
returns the previous accounts hash for slot
sourcepub fn set_accounts_hash_from_snapshot(
&mut self,
slot: Slot,
accounts_hash: SerdeAccountsHash,
capitalization: u64
) -> Option<(AccountsHash, u64)>
pub fn set_accounts_hash_from_snapshot( &mut self, slot: Slot, accounts_hash: SerdeAccountsHash, capitalization: u64 ) -> Option<(AccountsHash, u64)>
After deserializing a snapshot, set the accounts hash for the new AccountsDb
sourcepub fn get_accounts_hash(&self, slot: Slot) -> Option<(AccountsHash, u64)>
pub fn get_accounts_hash(&self, slot: Slot) -> Option<(AccountsHash, u64)>
Get the accounts hash for slot
sourcepub fn set_incremental_accounts_hash(
&self,
slot: Slot,
incremental_accounts_hash: (IncrementalAccountsHash, u64)
) -> Option<(IncrementalAccountsHash, u64)>
pub fn set_incremental_accounts_hash( &self, slot: Slot, incremental_accounts_hash: (IncrementalAccountsHash, u64) ) -> Option<(IncrementalAccountsHash, u64)>
Set the incremental accounts hash for slot
returns the previous incremental accounts hash for slot
sourcepub fn set_incremental_accounts_hash_from_snapshot(
&mut self,
slot: Slot,
incremental_accounts_hash: SerdeIncrementalAccountsHash,
capitalization: u64
) -> Option<(IncrementalAccountsHash, u64)>
pub fn set_incremental_accounts_hash_from_snapshot( &mut self, slot: Slot, incremental_accounts_hash: SerdeIncrementalAccountsHash, capitalization: u64 ) -> Option<(IncrementalAccountsHash, u64)>
After deserializing a snapshot, set the incremental accounts hash for the new AccountsDb
sourcepub fn get_incremental_accounts_hash(
&self,
slot: Slot
) -> Option<(IncrementalAccountsHash, u64)>
pub fn get_incremental_accounts_hash( &self, slot: Slot ) -> Option<(IncrementalAccountsHash, u64)>
Get the incremental accounts hash for slot
sourcepub fn purge_old_accounts_hashes(&self, last_full_snapshot_slot: Slot)
pub fn purge_old_accounts_hashes(&self, last_full_snapshot_slot: Slot)
Purge accounts hashes that are older than last_full_snapshot_slot
Should only be called by AccountsHashVerifier, since it consumes the accounts hashes and knows which ones are still needed.
pub fn calculate_accounts_hash_from_storages( &self, config: &CalcAccountsHashConfig<'_>, storages: &SortedStorages<'_>, stats: HashStats ) -> Result<(AccountsHash, u64), AccountsHashVerificationError>
sourcepub fn calculate_incremental_accounts_hash(
&self,
config: &CalcAccountsHashConfig<'_>,
storages: &SortedStorages<'_>,
stats: HashStats
) -> Result<(IncrementalAccountsHash, u64), AccountsHashVerificationError>
pub fn calculate_incremental_accounts_hash( &self, config: &CalcAccountsHashConfig<'_>, storages: &SortedStorages<'_>, stats: HashStats ) -> Result<(IncrementalAccountsHash, u64), AccountsHashVerificationError>
Calculate the incremental accounts hash
This calculation is intended to be used by incremental snapshots, and thus differs from a “full” accounts hash in a few ways:
- Zero-lamport accounts are included in the hash because zero-lamport accounts are also included in the incremental snapshot. This ensures reconstructing the AccountsDb is still correct when using this incremental accounts hash.
storages
must be the same as the ones going into the incremental snapshot.
sourcepub fn verify_accounts_hash_and_lamports(
&self,
slot: Slot,
total_lamports: u64,
base: Option<(Slot, u64)>,
config: VerifyAccountsHashAndLamportsConfig<'_>
) -> Result<(), AccountsHashVerificationError>
pub fn verify_accounts_hash_and_lamports( &self, slot: Slot, total_lamports: u64, base: Option<(Slot, u64)>, config: VerifyAccountsHashAndLamportsConfig<'_> ) -> Result<(), AccountsHashVerificationError>
Verify accounts hash at startup (or tests)
Calculate accounts hash(es) and compare them to the values set at startup.
If base
is None
, only calculates the full accounts hash for [0, slot]
.
If base
is Some
, calculate the full accounts hash for [0, base slot]
and then calculate the incremental accounts hash for (base slot, slot]
.
sourcepub fn calculate_accounts_delta_hash(&self, slot: Slot) -> AccountsDeltaHash
pub fn calculate_accounts_delta_hash(&self, slot: Slot) -> AccountsDeltaHash
Calculate accounts delta hash for slot
As part of calculating the accounts delta hash, get a list of accounts modified this slot
(aka dirty pubkeys) and add them to self.uncleaned_pubkeys
for future cleaning.
sourcepub fn set_accounts_delta_hash_from_snapshot(
&mut self,
slot: Slot,
accounts_delta_hash: SerdeAccountsDeltaHash
) -> Option<AccountsDeltaHash>
pub fn set_accounts_delta_hash_from_snapshot( &mut self, slot: Slot, accounts_delta_hash: SerdeAccountsDeltaHash ) -> Option<AccountsDeltaHash>
After deserializing a snapshot, set the accounts delta hash for the new AccountsDb
sourcepub fn get_accounts_delta_hash(&self, slot: Slot) -> Option<AccountsDeltaHash>
pub fn get_accounts_delta_hash(&self, slot: Slot) -> Option<AccountsDeltaHash>
Get the accounts delta hash for slot
in the accounts_delta_hashes
map
sourcepub fn update_bank_hash_stats_from_snapshot(
&mut self,
slot: Slot,
stats: BankHashStats
) -> Option<BankHashStats>
pub fn update_bank_hash_stats_from_snapshot( &mut self, slot: Slot, stats: BankHashStats ) -> Option<BankHashStats>
When reconstructing AccountsDb from a snapshot, insert the bank_hash_stats
into the
internal bank hash stats map.
This fn is only called when loading from a snapshot, which means AccountsDb is new and its bank hash stats map is unpopulated. Except for slot 0.
Slot 0 is a special case. When a new AccountsDb is created–like when loading from a
snapshot–the bank hash stats map is populated with a default entry at slot 0. Remove the
default entry at slot 0, and then insert the new value at slot
.
sourcepub fn get_bank_hash_stats(&self, slot: Slot) -> Option<BankHashStats>
pub fn get_bank_hash_stats(&self, slot: Slot) -> Option<BankHashStats>
Get the bank hash stats for slot
in the bank_hash_stats
map
pub fn store_cached<'a, T: ReadableAccount + Sync + ZeroLamport + 'a>( &self, accounts: impl StorableAccounts<'a, T>, transactions: Option<&'a [Option<&'a SanitizedTransaction>]> )
sourcepub fn store_uncached(
&self,
slot: Slot,
accounts: &[(&Pubkey, &AccountSharedData)]
)
pub fn store_uncached( &self, slot: Slot, accounts: &[(&Pubkey, &AccountSharedData)] )
Store the account update. only called by tests
pub fn add_root(&self, slot: Slot) -> AccountsAddRootTiming
sourcepub fn get_snapshot_storages(
&self,
requested_slots: impl RangeBounds<Slot> + Sync
) -> (Vec<Arc<AccountStorageEntry>>, Vec<Slot>)
pub fn get_snapshot_storages( &self, requested_slots: impl RangeBounds<Slot> + Sync ) -> (Vec<Arc<AccountStorageEntry>>, Vec<Slot>)
Get storages to use for snapshots, for the requested slots
pub fn is_filler_account_helper( pubkey: &Pubkey, filler_account_suffix: Option<&Pubkey> ) -> bool
sourcepub fn is_filler_account(&self, pubkey: &Pubkey) -> bool
pub fn is_filler_account(&self, pubkey: &Pubkey) -> bool
true if ‘pubkey’ is a filler account
sourcepub fn filler_accounts_enabled(&self) -> bool
pub fn filler_accounts_enabled(&self) -> bool
true if it is possible that there are filler accounts present
sourcepub fn maybe_add_filler_accounts(
&self,
epoch_schedule: &EpochSchedule,
slot: Slot
)
pub fn maybe_add_filler_accounts( &self, epoch_schedule: &EpochSchedule, slot: Slot )
filler accounts are space-holding accounts which are ignored by hash calculations and rent. They are designed to allow a validator to run against a network successfully while simulating having many more accounts present. All filler accounts share a common pubkey suffix. The suffix is randomly generated per validator on startup. The filler accounts are added to each slot in the snapshot after index generation. The accounts added in a slot are setup to have pubkeys such that rent will be collected from them before (or when?) their slot becomes an epoch old. Thus, the filler accounts are rewritten by rent and the old slot can be thrown away successfully.