pub struct AuthorityStore { /* private fields */ }
Expand description
ALL_OBJ_VER determines whether we want to store all past versions of every object in the store. Authority doesn’t store them, but other entities such as replicas will. S is a template on Authority signature state. This allows SuiDataStore to be used on either authorities or non-authorities. Specifically, when storing transactions and effects, S allows SuiDataStore to either store the authority signed version or unsigned version.
Implementations§
Source§impl AuthorityStore
impl AuthorityStore
Sourcepub async fn open(
perpetual_tables: Arc<AuthorityPerpetualTables>,
genesis: &Genesis,
config: &NodeConfig,
registry: &Registry,
) -> SuiResult<Arc<Self>>
pub async fn open( perpetual_tables: Arc<AuthorityPerpetualTables>, genesis: &Genesis, config: &NodeConfig, registry: &Registry, ) -> SuiResult<Arc<Self>>
Open an authority store by directory path. If the store is empty, initialize it using genesis.
pub fn update_epoch_flags_metrics(&self, old: &[EpochFlag], new: &[EpochFlag])
pub fn clear_object_per_epoch_marker_table( &self, _execution_guard: &RwLockWriteGuard<'_, EpochId>, ) -> SuiResult<()>
pub async fn open_with_committee_for_testing( perpetual_tables: Arc<AuthorityPerpetualTables>, committee: &Committee, genesis: &Genesis, ) -> SuiResult<Arc<Self>>
Sourcepub fn open_no_genesis(
perpetual_tables: Arc<AuthorityPerpetualTables>,
enable_epoch_sui_conservation_check: bool,
registry: &Registry,
) -> SuiResult<Arc<Self>>
pub fn open_no_genesis( perpetual_tables: Arc<AuthorityPerpetualTables>, enable_epoch_sui_conservation_check: bool, registry: &Registry, ) -> SuiResult<Arc<Self>>
Open authority store without any operations that require genesis, such as constructing EpochStartConfiguration or inserting genesis objects.
pub fn get_recovery_epoch_at_restart(&self) -> SuiResult<EpochId>
pub fn get_effects( &self, effects_digest: &TransactionEffectsDigest, ) -> SuiResult<Option<TransactionEffects>>
Sourcepub fn effects_exists(
&self,
effects_digest: &TransactionEffectsDigest,
) -> SuiResult<bool>
pub fn effects_exists( &self, effects_digest: &TransactionEffectsDigest, ) -> SuiResult<bool>
Returns true if we have an effects structure for this transaction digest
pub fn get_events( &self, digest: &TransactionDigest, ) -> Result<Option<TransactionEvents>, TypedStoreError>
pub fn get_events_by_events_digest( &self, event_digest: &TransactionEventsDigest, ) -> Result<Option<TransactionEvents>, TypedStoreError>
pub fn multi_get_events( &self, event_digests: &[TransactionDigest], ) -> SuiResult<Vec<Option<TransactionEvents>>>
pub fn multi_get_effects<'a>( &self, effects_digests: impl Iterator<Item = &'a TransactionEffectsDigest>, ) -> Result<Vec<Option<TransactionEffects>>, TypedStoreError>
pub fn get_executed_effects( &self, tx_digest: &TransactionDigest, ) -> Result<Option<TransactionEffects>, TypedStoreError>
Sourcepub fn multi_get_executed_effects_digests(
&self,
digests: &[TransactionDigest],
) -> Result<Vec<Option<TransactionEffectsDigest>>, TypedStoreError>
pub fn multi_get_executed_effects_digests( &self, digests: &[TransactionDigest], ) -> Result<Vec<Option<TransactionEffectsDigest>>, TypedStoreError>
Given a list of transaction digests, returns a list of the corresponding effects only if they have been executed. For transactions that have not been executed, None is returned.
Sourcepub fn multi_get_executed_effects(
&self,
digests: &[TransactionDigest],
) -> Result<Vec<Option<TransactionEffects>>, TypedStoreError>
pub fn multi_get_executed_effects( &self, digests: &[TransactionDigest], ) -> Result<Vec<Option<TransactionEffects>>, TypedStoreError>
Given a list of transaction digests, returns a list of the corresponding effects only if they have been executed. For transactions that have not been executed, None is returned.
pub fn is_tx_already_executed( &self, digest: &TransactionDigest, ) -> SuiResult<bool>
pub fn get_marker_value( &self, object_key: FullObjectKey, epoch_id: EpochId, ) -> SuiResult<Option<MarkerValue>>
pub fn get_latest_marker( &self, object_id: FullObjectID, epoch_id: EpochId, ) -> SuiResult<Option<(SequenceNumber, MarkerValue)>>
Sourcepub async fn notify_read_root_state_hash(
&self,
epoch: EpochId,
) -> SuiResult<(CheckpointSequenceNumber, Accumulator)>
pub async fn notify_read_root_state_hash( &self, epoch: EpochId, ) -> SuiResult<(CheckpointSequenceNumber, Accumulator)>
Returns future containing the state hash for the given epoch once available
pub fn deprecated_insert_finalized_transactions( &self, digests: &[TransactionDigest], epoch: EpochId, sequence: CheckpointSequenceNumber, ) -> SuiResult
pub fn deprecated_get_transaction_checkpoint( &self, digest: &TransactionDigest, ) -> SuiResult<Option<(EpochId, CheckpointSequenceNumber)>>
pub fn deprecated_multi_get_transaction_checkpoint( &self, digests: &[TransactionDigest], ) -> SuiResult<Vec<Option<(EpochId, CheckpointSequenceNumber)>>>
Sourcepub fn database_is_empty(&self) -> SuiResult<bool>
pub fn database_is_empty(&self) -> SuiResult<bool>
Returns true if there are no objects in the database
pub fn object_exists_by_key( &self, object_id: &ObjectID, version: VersionNumber, ) -> SuiResult<bool>
pub fn multi_object_exists_by_key( &self, object_keys: &[ObjectKey], ) -> SuiResult<Vec<bool>>
pub fn multi_get_objects_by_key( &self, object_keys: &[ObjectKey], ) -> Result<Vec<Option<Object>>, SuiError>
Sourcepub fn get_objects(
&self,
objects: &[ObjectID],
) -> Result<Vec<Option<Object>>, SuiError>
pub fn get_objects( &self, objects: &[ObjectID], ) -> Result<Vec<Option<Object>>, SuiError>
Get many objects
pub fn bulk_insert_live_objects( perpetual_db: &AuthorityPerpetualTables, live_objects: impl Iterator<Item = LiveObject>, expected_sha3_digest: &[u8; 32], ) -> SuiResult<()>
pub fn set_epoch_start_configuration( &self, epoch_start_configuration: &EpochStartConfiguration, ) -> SuiResult
pub fn get_epoch_start_configuration( &self, ) -> SuiResult<Option<EpochStartConfiguration>>
Sourcepub fn build_db_batch(
&self,
epoch_id: EpochId,
tx_outputs: &[Arc<TransactionOutputs>],
) -> SuiResult<DBBatch>
pub fn build_db_batch( &self, epoch_id: EpochId, tx_outputs: &[Arc<TransactionOutputs>], ) -> SuiResult<DBBatch>
Updates the state resulting from the execution of a certificate.
Internally it checks that all locks for active inputs are at the correct version, and then writes objects, certificates, parents and clean up locks atomically.
pub fn acquire_transaction_locks( &self, epoch_store: &AuthorityPerEpochStore, owned_input_objects: &[ObjectRef], tx_digest: TransactionDigest, signed_transaction: Option<VerifiedSignedTransaction>, ) -> SuiResult
Sourcepub fn check_owned_objects_are_live(&self, objects: &[ObjectRef]) -> SuiResult
pub fn check_owned_objects_are_live(&self, objects: &[ObjectRef]) -> SuiResult
Checks multiple object locks exist. Returns UserInputError::ObjectNotFound if cannot find lock record for at least one of the objects. Returns UserInputError::ObjectVersionUnavailableForConsumption if at least one object lock is not initialized at the given version.
pub fn initialize_live_object_markers( live_object_marker_table: &DBMap<ObjectRef, Option<LockDetailsWrapperDeprecated>>, write_batch: &mut DBBatch, objects: &[ObjectRef], is_force_reset: bool, ) -> SuiResult
Sourcepub fn revert_state_update(&self, tx_digest: &TransactionDigest) -> SuiResult
pub fn revert_state_update(&self, tx_digest: &TransactionDigest) -> SuiResult
This function is called at the end of epoch for each transaction that’s executed locally on the validator but didn’t make to the last checkpoint. The effects of the execution is reverted here. The following things are reverted:
- All new object states are deleted.
- owner_index table change is reverted.
NOTE: transaction and effects are intentionally not deleted. It’s possible that if this node is behind, the network will execute the transaction in a later epoch. In that case, we need to keep it saved so that when we receive the checkpoint that includes it from state sync, we are able to execute the checkpoint. TODO: implement GC for transactions that are no longer needed.
Sourcepub fn find_object_lt_or_eq_version(
&self,
object_id: ObjectID,
version: SequenceNumber,
) -> SuiResult<Option<Object>>
pub fn find_object_lt_or_eq_version( &self, object_id: ObjectID, version: SequenceNumber, ) -> SuiResult<Option<Object>>
Return the object with version less then or eq to the provided seq number. This is used by indexer to find the correct version of dynamic field child object. We do not store the version of the child object, but because of lamport timestamp, we know the child must have version number less then or eq to the parent.
Sourcepub fn get_latest_object_ref_or_tombstone(
&self,
object_id: ObjectID,
) -> Result<Option<ObjectRef>, SuiError>
pub fn get_latest_object_ref_or_tombstone( &self, object_id: ObjectID, ) -> Result<Option<ObjectRef>, SuiError>
Returns the latest object reference we have for this object_id in the objects table.
The method may also return the reference to a deleted object with a digest of ObjectDigest::deleted() or ObjectDigest::wrapped() and lamport version of a transaction that deleted the object. Note that a deleted object may re-appear if the deletion was the result of the object being wrapped in another object.
If no entry for the object_id is found, return None.
Sourcepub fn get_latest_object_ref_if_alive(
&self,
object_id: ObjectID,
) -> Result<Option<ObjectRef>, SuiError>
pub fn get_latest_object_ref_if_alive( &self, object_id: ObjectID, ) -> Result<Option<ObjectRef>, SuiError>
Returns the latest object reference if and only if the object is still live (i.e. it does not return tombstones)
Sourcepub fn get_latest_object_or_tombstone(
&self,
object_id: ObjectID,
) -> Result<Option<(ObjectKey, ObjectOrTombstone)>, SuiError>
pub fn get_latest_object_or_tombstone( &self, object_id: ObjectID, ) -> Result<Option<(ObjectKey, ObjectOrTombstone)>, SuiError>
Returns the latest object we have for this object_id in the objects table.
If no entry for the object_id is found, return None.
pub fn insert_transaction_and_effects( &self, transaction: &VerifiedTransaction, transaction_effects: &TransactionEffects, ) -> Result<(), TypedStoreError>
pub fn multi_insert_transaction_and_effects<'a>( &self, transactions: impl Iterator<Item = &'a VerifiedExecutionData>, ) -> Result<(), TypedStoreError>
pub fn multi_get_transaction_blocks( &self, tx_digests: &[TransactionDigest], ) -> Result<Vec<Option<VerifiedTransaction>>, TypedStoreError>
pub fn get_transaction_block( &self, tx_digest: &TransactionDigest, ) -> Result<Option<VerifiedTransaction>, TypedStoreError>
Sourcepub fn get_sui_system_state_object_unsafe(&self) -> SuiResult<SuiSystemState>
pub fn get_sui_system_state_object_unsafe(&self) -> SuiResult<SuiSystemState>
This function reads the DB directly to get the system state object. If reconfiguration is happening at the same time, there is no guarantee whether we would be getting the old or the new system state object. Hence this function should only be called during RPC reads where data race is not a major concern. In general we should avoid this as much as possible. If the intent is for testing, you can use AuthorityState:: get_sui_system_state_object_for_testing.
pub fn expensive_check_sui_conservation<T>( self: &Arc<Self>, type_layout_store: T, old_epoch_store: &AuthorityPerEpochStore, ) -> SuiResult
Sourcepub fn maybe_reaccumulate_state_hash(
&self,
cur_epoch_store: &AuthorityPerEpochStore,
new_protocol_version: ProtocolVersion,
)
pub fn maybe_reaccumulate_state_hash( &self, cur_epoch_store: &AuthorityPerEpochStore, new_protocol_version: ProtocolVersion, )
This is a temporary method to be used when we enable simplified_unwrap_then_delete. It re-accumulates state hash for the new epoch if simplified_unwrap_then_delete is enabled.
pub async fn prune_objects_and_compact_for_testing( &self, checkpoint_store: &Arc<CheckpointStore>, rpc_index: Option<&RpcIndexStore>, )
Trait Implementations§
Source§impl AccumulatorStore for AuthorityStore
impl AccumulatorStore for AuthorityStore
Source§fn get_object_ref_prior_to_key_deprecated(
&self,
object_id: &ObjectID,
version: VersionNumber,
) -> SuiResult<Option<ObjectRef>>
fn get_object_ref_prior_to_key_deprecated( &self, object_id: &ObjectID, version: VersionNumber, ) -> SuiResult<Option<ObjectRef>>
fn get_root_state_accumulator_for_epoch( &self, epoch: EpochId, ) -> SuiResult<Option<(CheckpointSequenceNumber, Accumulator)>>
fn get_root_state_accumulator_for_highest_epoch( &self, ) -> SuiResult<Option<(EpochId, (CheckpointSequenceNumber, Accumulator))>>
fn insert_state_accumulator_for_epoch( &self, epoch: EpochId, last_checkpoint_of_epoch: &CheckpointSequenceNumber, acc: &Accumulator, ) -> SuiResult
fn iter_live_object_set( &self, include_wrapped_object: bool, ) -> Box<dyn Iterator<Item = LiveObject> + '_>
fn iter_cached_live_object_set_for_testing( &self, include_wrapped_tombstone: bool, ) -> Box<dyn Iterator<Item = LiveObject> + '_>
Source§impl ObjectStore for AuthorityStore
impl ObjectStore for AuthorityStore
Source§fn get_object(&self, object_id: &ObjectID) -> Option<Object>
fn get_object(&self, object_id: &ObjectID) -> Option<Object>
Read an object and return it, or Ok(None) if the object was not found.
fn get_object_by_key( &self, object_id: &ObjectID, version: VersionNumber, ) -> Option<Object>
fn multi_get_objects(&self, object_ids: &[ObjectID]) -> Vec<Option<Object>>
fn multi_get_objects_by_key( &self, object_keys: &[ObjectKey], ) -> Vec<Option<Object>>
Auto Trait Implementations§
impl !Freeze for AuthorityStore
impl !RefUnwindSafe for AuthorityStore
impl Send for AuthorityStore
impl Sync for AuthorityStore
impl Unpin for AuthorityStore
impl !UnwindSafe for AuthorityStore
Blanket Implementations§
§impl<T> AnySync for T
impl<T> AnySync for T
§impl<U> As for U
impl<U> As for U
§fn as_<T>(self) -> Twhere
T: CastFrom<U>,
fn as_<T>(self) -> Twhere
T: CastFrom<U>,
self
to type T
. The semantics of numeric casting with the as
operator are followed, so <T as As>::as_::<U>
can be used in the same way as T as U
for numeric conversions. Read more§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a Request
§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered
].§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.