ProgramCache

Struct ProgramCache 

Source
pub struct ProgramCache<FG: ForkGraph> {
    pub latest_root_slot: Slot,
    pub stats: ProgramCacheStats,
    pub fork_graph: Option<Weak<RwLock<FG>>>,
    pub loading_task_waiter: Arc<LoadingTaskWaiter>,
    /* private fields */
}
👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.
Expand description

This structure is the global cache of loaded, verified and compiled programs.

It …

  • is validator global and fork graph aware, so it can optimize the commonalities across banks.
  • handles the visibility rules of un/re/deployments.
  • stores the usage statistics and verification status of each program.
  • is elastic and uses a probabilistic eviction strategy based on the usage statistics.
  • also keeps the compiled executables around, but only for the most used programs.
  • supports various kinds of tombstones to avoid loading programs which can not be loaded.
  • cleans up entries on orphan branches when the block store is rerooted.
  • supports the cache preparation phase before feature activations which can change cached programs.
  • manages the environments of the programs and upcoming environments for the next epoch.
  • allows for cooperative loading of TX batches which hit the same missing programs simultaneously.
  • enforces that all programs used in a batch are eagerly loaded ahead of execution.
  • is not persisted to disk or a snapshot, so it needs to cold start and warm up first.

Fields§

§latest_root_slot: Slot
👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

The slot of the last rerooting

§stats: ProgramCacheStats
👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Statistics counters

§fork_graph: Option<Weak<RwLock<FG>>>
👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Reference to the block store

§loading_task_waiter: Arc<LoadingTaskWaiter>
👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Coordinates TX batches waiting for others to complete their task during cooperative loading

Implementations§

Source§

impl<FG: ForkGraph> ProgramCache<FG>

Source

pub fn new(root_slot: Slot) -> Self

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.
Source

pub fn set_fork_graph(&mut self, fork_graph: Weak<RwLock<FG>>)

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.
Source

pub fn assign_program( &mut self, program_runtime_environments: &ProgramRuntimeEnvironments, key: Pubkey, entry: Arc<ProgramCacheEntry>, ) -> bool

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Insert a single entry. It’s typically called during transaction loading, when the cache doesn’t contain the entry corresponding to program key.

Source

pub fn prune_by_deployment_slot(&mut self, slot: Slot)

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.
Source

pub fn prune( &mut self, new_root_slot: Slot, upcoming_environments: Option<ProgramRuntimeEnvironments>, )

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Before rerooting the blockstore this removes all superfluous entries

Source

pub fn extract( &self, search_for: &mut Vec<(Pubkey, ProgramCacheMatchCriteria)>, loaded_programs_for_tx_batch: &mut ProgramCacheForTxBatch, program_runtime_environments_for_execution: &ProgramRuntimeEnvironments, increment_usage_counter: bool, count_hits_and_misses: bool, ) -> Option<Pubkey>

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Extracts a subset of the programs relevant to a transaction batch and returns which program accounts the accounts DB needs to load.

Source

pub fn finish_cooperative_loading_task( &mut self, program_runtime_environments: &ProgramRuntimeEnvironments, slot: Slot, key: Pubkey, loaded_program: Arc<ProgramCacheEntry>, ) -> bool

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Called by Bank::replenish_program_cache() for each program that is done loading.

Source

pub fn merge( &mut self, program_runtime_environments: &ProgramRuntimeEnvironments, modified_entries: &HashMap<Pubkey, Arc<ProgramCacheEntry>>, )

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.
Source

pub fn get_flattened_entries( &self, include_program_runtime_v1: bool, _include_program_runtime_v2: bool, ) -> Vec<(Pubkey, Arc<ProgramCacheEntry>)>

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Returns the list of entries which are verified and compiled.

Source

pub fn get_flattened_entries_for_tests( &self, ) -> Vec<(Pubkey, Arc<ProgramCacheEntry>)>

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Returns the list of all entries in the cache.

Source

pub fn get_slot_versions_for_tests( &self, key: &Pubkey, ) -> &[Arc<ProgramCacheEntry>]

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Returns the slot versions for the given program id.

Source

pub fn sort_and_unload(&mut self, shrink_to: PercentageInteger)

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Unloads programs which were used infrequently

Source

pub fn evict_using_2s_random_selection( &mut self, shrink_to: PercentageInteger, now: Slot, )

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Evicts programs using 2’s random selection, choosing the least used program out of the two entries. The eviction is performed enough number of times to reduce the cache usage to the given percentage.

Source

pub fn remove_programs(&mut self, keys: impl Iterator<Item = Pubkey>)

👎Deprecated since 3.1.0: This crate has been marked for formal inclusion in the Agave Unstable API. From v4.0.0 onward, the agave-unstable-api crate feature must be specified to acknowledge use of an interface that may break without warning.

Removes all the entries at the given keys, if they exist

Trait Implementations§

Source§

impl<FG: ForkGraph> Debug for ProgramCache<FG>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<FG> !Freeze for ProgramCache<FG>

§

impl<FG> RefUnwindSafe for ProgramCache<FG>

§

impl<FG> Send for ProgramCache<FG>
where FG: Send + Sync,

§

impl<FG> Sync for ProgramCache<FG>
where FG: Send + Sync,

§

impl<FG> Unpin for ProgramCache<FG>

§

impl<FG> UnwindSafe for ProgramCache<FG>

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

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.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.
Source§

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

Source§

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

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.
Source§

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

Source§

fn vzip(self) -> V