Skip to main content

ShardStateStorage

Struct ShardStateStorage 

Source
pub struct ShardStateStorage { /* private fields */ }

Implementations§

Source§

impl ShardStateStorage

Source

pub fn new( cells_db: CellsDb, block_handle_storage: Arc<BlockHandleStorage>, block_storage: Arc<BlockStorage>, block_connections: Arc<BlockConnectionStorage>, temp_file_storage: TempFileStorage, config: &CoreStorageConfig, ) -> Result<Arc<Self>>

Source

pub fn metrics(&self) -> ShardStateStorageMetrics

Source

pub fn min_ref_mc_state(&self) -> &MinRefMcStateTracker

Source

pub fn cell_storage(&self) -> &Arc<CellStorage>

Source

pub fn load_mc_block_id(&self, seqno: u32) -> Result<Option<BlockId>>

Find mc block id from db snapshot

Source

pub async fn store_state_ignore_cache( &self, handle: &BlockHandle, state: &ShardStateStuff, hint: StoreStateHint, ) -> Result<()>

Source

pub async fn store_state_root_ignore_cache( &self, handle: &BlockHandle, root: Cell, ref_mc_state_handle: RefMcStateHandle, hint: StoreStateHint, ) -> Result<()>

Source

pub fn begin_store_next_state( self: &Arc<Self>, prev_handle: &BlockHandle, next_handle: &BlockHandle, merkle_update: &MerkleUpdate, state: Option<ShardStateStuff>, hint: StoreStateHint, get_merkle_update: Option<Box<dyn Fn(&BlockId) -> Option<BlockInfoForApply> + Send + Sync + 'static>>, ) -> Result<InitiatedStoreState>

Stores a state for the specified block pair of blocks using their merkle update and and optional state root.

§How does it work

State must be stored into CellsDb at least every store_shard_state_step blocks (where it is forced to be 1 for masterchain). When we first initialize the cache state for a shard we load the closest direct state for the target with all required “virtual” states. After that we decide how should the next state be stored (as “direct” or “virtual”) and store a spawned task into the cache.

Source

pub async fn store_state_file( &self, block_id: &BlockId, boc: File, ) -> Result<HashBytes>

Source

pub async fn store_state_bytes( &self, block_id: &BlockId, boc: Bytes, ) -> Result<HashBytes>

Source

pub fn load_state( &self, ref_by_mc_seqno: u32, block_id: &BlockId, ) -> impl Future<Output = Result<ShardStateStuff>>

Loads (or computes) a state for the specified block.

Source

pub async fn load_state_ext<F>( &self, ref_by_mc_seqno: u32, block_id: &BlockId, hint: LoadStateHint, get_merkle_update: F, ) -> Result<ShardStateStuff>

Loads (or computes) a state for the specified block using an optional cache of yet unsaved blocks.

§How does it work

State is stored into CellsDb at least every store_shard_state_step blocks. So when we load a state we must find some pivot state first and then apply required intermediate merkle updates to it. We know the maximum number of such updates so we can tell when the state is absent.

Merkle updates are loaded either using some external get_merkle_update or from the storage.

§Store/load operation reuse

Saving states takes some time. So while loading a state we can attach to the original “saving future” and use its result. We will always attach to the “virtual” state future because otherwise we will be doing the same work. And we attach to “direct” states when their future is either complete, or we are deep enough in our apply routine.

Source

pub fn load_state_root_hash(&self, block_id: &BlockId) -> Result<HashBytes>

Source

pub fn load_state_root_hash_opt( &self, block_id: &BlockId, ) -> Result<Option<HashBytes>>

Source

pub async fn remove_outdated_states(&self, mc_seqno: u32) -> Result<()>

Source

pub async fn compute_recent_blocks( &self, mc_seqno: u32, ) -> Result<Option<TopBlocks>>

Searches for an edge with the least referenced masterchain block

Returns None if all states are recent enough

Auto Trait Implementations§

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> 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 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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

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

Initializes a with the given initializer. Read more
Source§

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

Dereferences the given pointer. Read more
Source§

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

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. 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

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
Source§

impl<T> EquivalentRepr<T> for T