struct Actor {Show 23 fields
io: Arc<dyn WalObjectIo>,
catalog: Arc<RwLock<ObjectCatalog>>,
obsolete_entry_ids: Arc<Mutex<HashMap<RegionId, EntryId>>>,
terminal_error: Arc<Mutex<Option<Arc<Error>>>>,
stopped: Arc<AtomicBool>,
command_rx: Receiver<Command>,
append_rx: Receiver<(Vec<Entry>, Sender<Result<AppendBatchResponse>>)>,
ack_mode: AckMode,
max_unpersisted_bytes: usize,
max_unpersisted_age: Duration,
open_batch: OpenBatch,
issued_entry_ids: HashMap<RegionId, EntryId>,
pending: Vec<PendingAppend>,
sealed: VecDeque<SealedBatch>,
creates: FuturesUnordered<BoxFuture<'static, (u64, Result<PutResult>)>>,
stalled: Option<(Vec<Entry>, Sender<Result<AppendBatchResponse>>)>,
durable_waiters: Vec<DurableWaiter>,
stop: Vec<Sender<Result<()>>>,
stop_error: Option<Arc<Error>>,
next_object_seq: Option<u64>,
epoch: u64,
last_indexed: ChainLink,
flush_interval: Duration,
}Expand description
The actor that owns the open batch and the sealed batches until they are durable.
Sealed batches form a pipeline in sequence order. A batch is created under
its sequence as soon as one of MAX_IN_FLIGHT_CREATES slots is free, but
it is indexed and acknowledged only once every earlier batch is, so the
acknowledged history of a region never has a missing predecessor. Every
batch links to its pipeline predecessor, the batch sealed before it, or to
the last indexed object when no earlier batch waits, so recovery replays a
batch only on the chain of a later object. The outcomes of a create are:
| Situation | Sequence | Waiters | Store |
|---|---|---|---|
| created, or identical retry | advances | acknowledged in order | healthy |
transient error, durable mode | never reused: a create that reported an error may have written its object | every batch that is not indexed fails, created ones included; retries are assigned new ids | healthy: the next batch links to the last indexed object, so no chain reaches a failed batch |
transient error, enqueued mode | unchanged | already acknowledged | healthy: the create is repeated with the same bytes after CREATE_RETRY_DELAY, which an identical retry accepts |
transient error, enqueued mode after stop began | never reused | already acknowledged | the backlog is dropped and stop reports the error |
an object of an earlier epoch holds the sequence, durable mode | never reused | as for a transient error | healthy: that object can never be on the chain |
an object of the same or a later epoch holds the sequence, any conflicting object in the enqueued mode, encoding or catalog error | unchanged | every batch that is not indexed fails | poisoned |
| created at the last representable sequence | cannot advance | acknowledged | poisoned: no later batch can be allocated a sequence |
A create still in flight when its batch failed runs to completion and its
outcome is ignored: whatever it stored is off the chain. After stop began
nothing is admitted and no create starts, except that the enqueued mode
uploads its backlog; creates in flight run to completion and acknowledge
if they succeed.
Appends arrive on their own channel, which the actor does not read while
MAX_SEALED_BATCHES batches wait or an append is held back at a backlog
threshold of the enqueued mode, so commands such as stop are handled
while admission is held back.
Fields§
§io: Arc<dyn WalObjectIo>§catalog: Arc<RwLock<ObjectCatalog>>§obsolete_entry_ids: Arc<Mutex<HashMap<RegionId, EntryId>>>§terminal_error: Arc<Mutex<Option<Arc<Error>>>>§stopped: Arc<AtomicBool>§command_rx: Receiver<Command>§append_rx: Receiver<(Vec<Entry>, Sender<Result<AppendBatchResponse>>)>§ack_mode: AckMode§max_unpersisted_bytes: usize§max_unpersisted_age: Duration§open_batch: OpenBatch§issued_entry_ids: HashMap<RegionId, EntryId>Largest entry id ever handed out per region, whether it became durable or failed. Unlike the accepted ids of the open batch it never moves down.
pending: Vec<PendingAppend>Waiters of the open batch in the durable mode.
sealed: VecDeque<SealedBatch>Batches that are not durable yet, in sequence order.
creates: FuturesUnordered<BoxFuture<'static, (u64, Result<PutResult>)>>Creates in flight, including those of batches that already failed.
stalled: Option<(Vec<Entry>, Sender<Result<AppendBatchResponse>>)>The append held back in the enqueued mode while the unpersisted
backlog is at a threshold. Later appends wait in their channel.
durable_waiters: Vec<DurableWaiter>§stop: Vec<Sender<Result<()>>>Callers of stop, answered once nothing is in flight.
stop_error: Option<Arc<Error>>The failure stop reports in the enqueued mode once an
acknowledged backlog was dropped, recorded when it happens.
next_object_seq: Option<u64>Sequence of the next sealed batch, None once the sequence is
exhausted. The open batch assigns its entry ids from it. It is above
every sealed batch and never moves back while the store runs.
epoch: u64Epoch of this instance, carried by every object it writes.
last_indexed: ChainLinkThe last indexed object, which is the start object until a batch is indexed. A batch sealed while no earlier batch waits extends it.
flush_interval: DurationImplementations§
Source§impl Actor
impl Actor
async fn run(self)
fn handle_append( &mut self, entries: Vec<Entry>, response: Sender<Result<AppendBatchResponse>>, )
Sourcefn admit(
&mut self,
entries: Vec<Entry>,
response: Sender<Result<AppendBatchResponse>>,
)
fn admit( &mut self, entries: Vec<Entry>, response: Sender<Result<AppendBatchResponse>>, )
Admits entries into the open batch, which assigns their ids under
the next object sequence. In the durable mode the caller waits for
the object, in the enqueued mode it is answered now.
Sourcefn backlog_at_threshold(&self) -> bool
fn backlog_at_threshold(&self) -> bool
Returns true once the unpersisted backlog, the open batch and every sealed batch that is not durable, reaches the size or the age threshold.
Sourcefn ensure_create_in_flight(&mut self)
fn ensure_create_in_flight(&mut self)
Seals the open batch when no create is in flight, so that a stalled append has an upload to wait for.
Sourcefn release_stalled(&mut self)
fn release_stalled(&mut self)
Admits the stalled append once the backlog is below the thresholds and the sealed batches leave room for the two an admission can seal.
Sourcefn flush_open_batch(&mut self) -> bool
fn flush_open_batch(&mut self) -> bool
Seals the open batch as the object next_object_seq and starts its
create when a slot is free. Returns whether a batch was sealed.
Sourcefn start_creates(&mut self)
fn start_creates(&mut self)
Starts the creates of pending batches in sequence order while fewer
than MAX_IN_FLIGHT_CREATES are in flight, counting the creates of
batches that already failed. Nothing starts once stop began, except
the backlog of the enqueued mode.
fn on_create_completed(&mut self, object_seq: u64, result: Result<PutResult>)
Sourcefn settle(&mut self)
fn settle(&mut self)
Indexes and acknowledges the sealed batches from the front as far as they are created, and starts the creates that a free slot allows.
Sourcefn index_front(&mut self) -> bool
fn index_front(&mut self) -> bool
Indexes the created object at the front and acknowledges its waiters. Returns false when the catalog rejected it, which poisons the store.
fn resolve_durable_waiters(&mut self)
Sourcefn is_durable_through(&self, region_id: RegionId, entry_id: EntryId) -> bool
fn is_durable_through(&self, region_id: RegionId, entry_id: EntryId) -> bool
Returns true when no id of the region at or below entry_id waits to
become durable. An id of a batch that failed will never be durable and
no longer waits.
Sourcefn lowest_pending_entry_id(&self, region_id: RegionId) -> Option<EntryId>
fn lowest_pending_entry_id(&self, region_id: RegionId) -> Option<EntryId>
Returns the lowest id of the region that was handed out and is not durable yet. The sealed batches are in sequence order and the open batch is above all of them.
Sourcefn roll_back(&mut self, error: Arc<Error>)
fn roll_back(&mut self, error: Arc<Error>)
Fails every batch that is not indexed after a create failed transiently, including batches already created and batches whose create is in flight. Their sequences are not reused: a create that reported an error may still have written its object. The next batch links to the last indexed object, so no later chain reaches a failed batch. Waiters of a store that was stopped meanwhile learn that instead of the I/O error, like every other entry that never became durable.
Sourcefn poison(&mut self, error: Error) -> Arc<Error>
fn poison(&mut self, error: Error) -> Arc<Error>
Records error as terminal and fails every waiter that is not
acknowledged with it, or with the stopped error if the store was
stopped meanwhile. Creates in flight run to completion, but their
outcome is ignored: in the durable mode the entries of an object they
create were never acknowledged, like those of a crash between creation
and acknowledgement; in the enqueued mode the acknowledged backlog is
discarded and stop reports it. Returns the recorded error.
Sourcefn reset_open_batch(&mut self)
fn reset_open_batch(&mut self)
Drops the entries of the open batch; the next admission hands out the same ids again under the sequence the batch is at.
Sourcefn fail_unacknowledged(&mut self, error: impl Fn() -> Error)
fn fail_unacknowledged(&mut self, error: impl Fn() -> Error)
Fails the waiters of the open batch, the stalled append and the durability waiters.
fn handle_wait_durable( &mut self, region_id: RegionId, entry_id: EntryId, response: Sender<Result<()>>, )
Sourcefn handle_obsolete(
&mut self,
region_id: RegionId,
entry_id: EntryId,
watermark: EntryId,
response: Sender<Result<()>>,
)
fn handle_obsolete( &mut self, region_id: RegionId, entry_id: EntryId, watermark: EntryId, response: Sender<Result<()>>, )
Makes sure no id of the region at or below entry_id is assigned
from now on, then records the obsolete watermark of the region;
neither is done when the sequence cannot be raised.
Sourcefn raise_sequence_floor(
&mut self,
region_id: RegionId,
entry_id: EntryId,
) -> Result<()>
fn raise_sequence_floor( &mut self, region_id: RegionId, entry_id: EntryId, ) -> Result<()>
Moves the sequence of the next object above the object that holds
entry_id unless it is there already. The move fails while the open
batch has handed out ids under the next sequence. A floor that does
not fit an entry id poisons the store like an exhausted sequence.
Sourcefn handle_stop(&mut self, response: Sender<Result<()>>)
fn handle_stop(&mut self, response: Sender<Result<()>>)
Begins stopping. Nothing is admitted from now on; the durable mode
drops the open batch and the batches whose create has not started,
the enqueued mode seals its backlog so it is uploaded. Stop is
answered by finish_stop once nothing is in flight.
Sourcefn finish_stop(&mut self) -> bool
fn finish_stop(&mut self) -> bool
Answers the callers of stop once every sealed batch is settled and
every create has completed. Returns true when the actor is done.
fn is_stopped(&self) -> bool
Auto Trait Implementations§
impl !Freeze for Actor
impl !RefUnwindSafe for Actor
impl Send for Actor
impl !Sync for Actor
impl Unpin for Actor
impl UnsafeUnpin for Actor
impl !UnwindSafe for Actor
Blanket Implementations§
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>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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§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§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> ServiceExt for T
impl<T> ServiceExt for T
§fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>where
Self: Sized,
fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>where
Self: Sized,
§fn add_extension<T>(self, value: T) -> AddExtension<Self, T>where
Self: Sized,
fn add_extension<T>(self, value: T) -> AddExtension<Self, T>where
Self: Sized,
§fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>where
Self: Sized,
fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>where
Self: Sized,
§fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
§fn compression(self) -> Compression<Self>where
Self: Sized,
fn compression(self) -> Compression<Self>where
Self: Sized,
§fn decompression(self) -> Decompression<Self>where
Self: Sized,
fn decompression(self) -> Decompression<Self>where
Self: Sized,
§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
§fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
fn follow_redirects(self) -> FollowRedirect<Self>where
Self: Sized,
§fn sensitive_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>where
Self: Sized,
fn sensitive_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>where
Self: Sized,
§fn sensitive_request_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<Self>where
Self: Sized,
fn sensitive_request_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveRequestHeaders<Self>where
Self: Sized,
§fn sensitive_response_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveResponseHeaders<Self>where
Self: Sized,
fn sensitive_response_headers(
self,
headers: impl IntoIterator<Item = HeaderName>,
) -> SetSensitiveResponseHeaders<Self>where
Self: Sized,
§fn override_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
fn override_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
§fn append_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
fn append_request_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
§fn insert_request_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
fn insert_request_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetRequestHeader<Self, M>where
Self: Sized,
§fn override_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
fn override_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
§fn append_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
fn append_response_header<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
§fn insert_response_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
fn insert_response_header_if_not_present<M>(
self,
header_name: HeaderName,
make: M,
) -> SetResponseHeader<Self, M>where
Self: Sized,
§fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_request_id<M>(
self,
header_name: HeaderName,
make_request_id: M,
) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
§fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>where
Self: Sized,
M: MakeRequestId,
x-request-id as the header name. Read more§fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_request_id(
self,
header_name: HeaderName,
) -> PropagateRequestId<Self>where
Self: Sized,
§fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
fn propagate_x_request_id(self) -> PropagateRequestId<Self>where
Self: Sized,
x-request-id as the header name. Read more§fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
Self: Sized,
fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>where
Self: Sized,
500 Internal Server responses. Read more§fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>where
Self: Sized,
413 Payload Too Large responses. Read more§fn trim_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
fn trim_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
§fn append_trailing_slash(self) -> NormalizePath<Self>where
Self: Sized,
fn append_trailing_slash(self) -> NormalizePath<Self>where
Self: 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.