Skip to main content

Actor

Struct Actor 

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

SituationSequenceWaitersStore
created, or identical retryadvancesacknowledged in orderhealthy
transient error, durable modenever reused: a create that reported an error may have written its objectevery batch that is not indexed fails, created ones included; retries are assigned new idshealthy: the next batch links to the last indexed object, so no chain reaches a failed batch
transient error, enqueued modeunchangedalready acknowledgedhealthy: the create is repeated with the same bytes after CREATE_RETRY_DELAY, which an identical retry accepts
transient error, enqueued mode after stop begannever reusedalready acknowledgedthe backlog is dropped and stop reports the error
an object of an earlier epoch holds the sequence, durable modenever reusedas for a transient errorhealthy: 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 errorunchangedevery batch that is not indexed failspoisoned
created at the last representable sequencecannot advanceacknowledgedpoisoned: 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: u64

Epoch of this instance, carried by every object it writes.

§last_indexed: ChainLink

The 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: Duration

Implementations§

Source§

impl Actor

Source

async fn run(self)

Source

fn handle_append( &mut self, entries: Vec<Entry>, response: Sender<Result<AppendBatchResponse>>, )

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

fn on_create_completed(&mut self, object_seq: u64, result: Result<PutResult>)

Source

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.

Source

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.

Source

fn resolve_durable_waiters(&mut self)

Source

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.

Source

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.

Source

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.

Source

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.

Source

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.

Source

fn fail_unacknowledged(&mut self, error: impl Fn() -> Error)

Fails the waiters of the open batch, the stalled append and the durability waiters.

Source

fn handle_wait_durable( &mut self, region_id: RegionId, entry_id: EntryId, response: Sender<Result<()>>, )

Source

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.

Source

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.

Source

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.

Source

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.

Source

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

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

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

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

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
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows 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) -> R
where R: 'a,

Mutably borrows 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
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

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
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> ServiceExt for T

§

fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>
where Self: Sized,

Propagate a header from the request to the response. Read more
§

fn add_extension<T>(self, value: T) -> AddExtension<Self, T>
where Self: Sized,

Add some shareable value to request extensions. Read more
§

fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>
where Self: Sized,

Apply a transformation to the request body. Read more
§

fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>
where Self: Sized,

Apply a transformation to the response body. Read more
§

fn compression(self) -> Compression<Self>
where Self: Sized,

Compresses response bodies. Read more
§

fn decompression(self) -> Decompression<Self>
where Self: Sized,

Decompress response bodies. Read more
§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using HTTP status codes. Read more
§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using gRPC headers. Read more
§

fn follow_redirects(self) -> FollowRedirect<Self>
where Self: Sized,

Follow redirect resposes using the Standard policy. Read more
§

fn sensitive_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>
where Self: Sized,

Mark headers as sensitive on both requests and responses. Read more
§

fn sensitive_request_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveRequestHeaders<Self>
where Self: Sized,

Mark headers as sensitive on requests. Read more
§

fn sensitive_response_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveResponseHeaders<Self>
where Self: Sized,

Mark headers as sensitive on responses. Read more
§

fn override_request_header<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Insert a header into the request. Read more
§

fn append_request_header<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Append a header into the request. Read more
§

fn insert_request_header_if_not_present<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Insert a header into the request, if the header is not already present. Read more
§

fn override_response_header<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Insert a header into the response. Read more
§

fn append_response_header<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Append a header into the response. Read more
§

fn insert_response_header_if_not_present<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Insert a header into the response, if the header is not already present. Read more
§

fn set_request_id<M>( self, header_name: HeaderName, make_request_id: M, ) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Add request id header and extension. Read more
§

fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Add request id header and extension, using x-request-id as the header name. Read more
§

fn propagate_request_id( self, header_name: HeaderName, ) -> PropagateRequestId<Self>
where Self: Sized,

Propgate request ids from requests to responses. Read more
§

fn propagate_x_request_id(self) -> PropagateRequestId<Self>
where Self: Sized,

Propgate request ids from requests to responses, using x-request-id as the header name. Read more
§

fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>
where Self: Sized,

Catch panics and convert them into 500 Internal Server responses. Read more
§

fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>
where Self: Sized,

Intercept requests with over-sized payloads and convert them into 413 Payload Too Large responses. Read more
§

fn trim_trailing_slash(self) -> NormalizePath<Self>
where Self: Sized,

Remove trailing slashes from paths. Read more
§

fn append_trailing_slash(self) -> NormalizePath<Self>
where Self: Sized,

Append trailing slash to paths. Read more
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> Any for T
where T: Any,

§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSend for T
where T: Send,