pub struct AccountsDb {
Show 17 fields pub accounts_index: AccountsIndex<AccountInfo>, pub accounts_hash_complete_one_epoch_old: RwLock<Slot>, 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>

Keeps tracks of index into AppendVec on a per slot basis

§accounts_hash_complete_one_epoch_old: RwLock<Slot>

slot that is one epoch older than the highest slot where accounts hash calculation has completed

§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

source

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.

source

pub fn notify_account_at_accounts_update<P>( &self, slot: Slot, account: &AccountSharedData, txn_signature: &Option<&Signature>, pubkey: &Pubkey, write_version_producer: &mut P )where P: Iterator<Item = u64>,

source§

impl AccountsDb

source

pub const ACCOUNTS_HASH_CACHE_DIR: &str = "accounts_hash_cache"

source

pub fn default_for_tests() -> Self

source

pub fn new_for_tests(paths: Vec<PathBuf>, cluster_type: &ClusterType) -> Self

source

pub fn new_for_tests_with_caching( paths: Vec<PathBuf>, cluster_type: &ClusterType ) -> Self

source

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

source

pub fn set_shrink_paths(&self, paths: Vec<PathBuf>)

source

pub fn file_size(&self) -> u64

source

pub fn new_single_for_tests() -> Self

source

pub fn new_single_for_tests_with_caching() -> Self

source

pub fn new_single_for_tests_with_secondary_indexes( secondary_indexes: AccountSecondaryIndexes ) -> Self

source

pub fn expected_cluster_type(&self) -> ClusterType

source

pub fn notify_accounts_hash_calculated_complete( &self, completed_slot: Slot, epoch_schedule: &EpochSchedule )

hash calc is completed as of ‘slot’ so, any process that wants to take action on really old slots can now proceed up to ‘completed_slot’-slots per epoch

source

pub fn clean_accounts_for_tests(&self)

Call clean_accounts() with the common parameters that tests/benches use.

source

pub fn clean_accounts( &self, max_clean_root_inclusive: Option<Slot>, is_startup: bool, last_full_snapshot_slot: Option<Slot> )

source

pub fn shrink_candidate_slots(&self) -> usize

source

pub fn shrink_all_slots( &self, is_startup: bool, last_full_snapshot_slot: Option<Slot> )

source

pub fn scan_accounts<F>( &self, ancestors: &Ancestors, bank_id: BankId, scan_func: F, config: &ScanConfig ) -> ScanResult<()>where F: FnMut(Option<(&Pubkey, AccountSharedData, Slot)>),

source

pub fn unchecked_scan_accounts<F>( &self, metric_name: &'static str, ancestors: &Ancestors, scan_func: F, config: &ScanConfig )where F: FnMut(&Pubkey, LoadedAccount<'_>, Slot),

source

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

source

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)>),

source

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

source

pub fn insert_default_bank_hash(&self, slot: Slot, parent_slot: Slot)

Insert a new bank hash for slot

The new bank hash is empty/default except for the slot. This fn is called when creating a new bank from parent. The bank hash for this slot is updated with real values later.

source

pub fn load( &self, ancestors: &Ancestors, pubkey: &Pubkey, load_hint: LoadHint ) -> Option<(AccountSharedData, Slot)>

source

pub fn load_account_into_read_cache(&self, ancestors: &Ancestors, pubkey: &Pubkey)

source

pub fn load_with_fixed_root( &self, ancestors: &Ancestors, pubkey: &Pubkey ) -> Option<(AccountSharedData, Slot)>

note this returns None for accounts with zero lamports

source

pub fn flush_read_only_cache_for_tests(&self)

remove all entries from the read only accounts cache useful for benches/tests

source

pub fn load_account_hash( &self, ancestors: &Ancestors, pubkey: &Pubkey, max_root: Option<Slot>, load_hint: LoadHint ) -> Option<Hash>

source

pub fn create_drop_bank_callback( &self, pruned_banks_sender: DroppedSlotsSender ) -> SendDroppedBankCallback

source

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.
source

pub fn remove_unrooted_slots(&self, remove_slots: &[(Slot, BankId)])

source

pub fn hash_account<T: ReadableAccount>( slot: Slot, account: &T, pubkey: &Pubkey, include_slot: IncludeSlotInHash ) -> Hash

source

pub fn mark_slot_frozen(&self, slot: Slot)

source

pub fn expire_old_recycle_stores(&self)

source

pub fn flush_accounts_cache( &self, force_flush: bool, requested_flush_root: Option<Slot> )

source

pub fn find_unskipped_slot( &self, slot: Slot, ancestors: Option<&Ancestors> ) -> Option<Slot>

find slot >= ‘slot’ which is a root or in ‘ancestors’

source

pub fn checked_iterative_sum_for_capitalization( total_cap: u64, new_cap: u64 ) -> u64

source

pub fn checked_sum_for_capitalization<T: Iterator<Item = u64>>( balances: T ) -> u64

source

pub fn calculate_accounts_hash_from_index( &self, max_slot: Slot, config: &CalcAccountsHashConfig<'_> ) -> Result<(AccountsHash, u64), BankHashVerificationError>

source

pub fn get_accounts_hash(&self, slot: Slot) -> AccountsHash

source

pub fn update_accounts_hash_for_tests( &self, slot: Slot, ancestors: &Ancestors, debug_verify: bool, is_startup: bool ) -> (AccountsHash, u64)

source

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 ) -> (AccountsHash, u64)

source

pub fn calculate_accounts_hash_from_storages( &self, config: &CalcAccountsHashConfig<'_>, storages: &SortedStorages<'_>, stats: HashStats ) -> Result<(AccountsHash, u64), BankHashVerificationError>

source

pub fn calculate_incremental_accounts_hash( &self, config: &CalcAccountsHashConfig<'_>, storages: &SortedStorages<'_>, base_slot: Slot, stats: HashStats ) -> Result<(AccountsHash, u64), BankHashVerificationError>

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 greater than base_slot. This follows the same requirements as incremental snapshots.
source

pub fn verify_bank_hash_and_lamports( &self, slot: Slot, ancestors: &Ancestors, total_lamports: u64, test_hash_calculation: bool, epoch_schedule: &EpochSchedule, rent_collector: &RentCollector, ignore_mismatch: bool, store_hash_raw_data_for_debug: bool, use_bg_thread_pool: bool ) -> Result<(), BankHashVerificationError>

Only called from startup or test code.

source

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.

source

pub fn get_bank_hash_info(&self, slot: Slot) -> Option<BankHashInfo>

Get the bank hash info for slot

source

pub fn set_bank_hash_info_from_snapshot( &self, slot: Slot, bank_hash_info: BankHashInfo )

When reconstructing AccountsDb from a snapshot, insert the bank_hash_info into the internal bank hashses map.

This fn is only called when loading from a snapshot, which means AccountsDb is new and its bank hashes is unpopulated. Therefore, a bank hash must not already exist at slot 1.

1 Slot 0 is a special case, however. When a new AccountsDb is created–like when loading from a snapshot–the bank hashes map is populated with a default entry at slot 0. It is valid to have a snapshot at slot 0, so it must be handled accordingly.


  1.  
source

pub fn store_cached<'a, T: ReadableAccount + Sync + ZeroLamport + 'a>( &self, accounts: impl StorableAccounts<'a, T>, txn_signatures: Option<&'a [Option<&'a Signature>]> )

source

pub fn store_uncached( &self, slot: Slot, accounts: &[(&Pubkey, &AccountSharedData)] )

Store the account update. only called by tests

source

pub fn add_root(&self, slot: Slot) -> AccountsAddRootTiming

source

pub fn get_snapshot_storages( &self, requested_slots: impl RangeBounds<Slot> + Sync, ancestors: Option<&Ancestors> ) -> (Vec<Arc<AccountStorageEntry>>, Vec<Slot>)

Get storages to use for snapshots, for the requested slots

source

pub fn is_filler_account_helper( pubkey: &Pubkey, filler_account_suffix: Option<&Pubkey> ) -> bool

source

pub fn is_filler_account(&self, pubkey: &Pubkey) -> bool

true if ‘pubkey’ is a filler account

source

pub fn filler_accounts_enabled(&self) -> bool

true if it is possible that there are filler accounts present

source

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.

source

pub fn generate_index( &self, limit_load_slot_count_from_snapshot: Option<usize>, verify: bool, genesis_config: &GenesisConfig ) -> IndexGenerationInfo

Trait Implementations§

source§

impl Debug for AccountsDb

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> AbiExample for T

source§

default fn example() -> T

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pointable for T

§

const ALIGN: usize = mem::align_of::<T>()

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more