mz_compute_client::protocol::command

Enum ComputeCommand

Source
pub enum ComputeCommand<T = Timestamp> {
    CreateTimely {
        config: TimelyConfig,
        epoch: ClusterStartupEpoch,
    },
    CreateInstance(InstanceConfig),
    InitializationComplete,
    AllowWrites,
    UpdateConfiguration(ComputeParameters),
    CreateDataflow(DataflowDescription<FlatPlan<T>, CollectionMetadata, T>),
    Schedule(GlobalId),
    AllowCompaction {
        id: GlobalId,
        frontier: Antichain<T>,
    },
    Peek(Peek<T>),
    CancelPeek {
        uuid: Uuid,
    },
}
Expand description

Compute protocol commands, sent by the compute controller to replicas.

Command sequences sent by the compute controller must be valid according to the Protocol Stages.

Variants§

§

CreateTimely

CreateTimely is the first command sent to a replica after a connection was established. It instructs the replica to initialize the timely dataflow runtime using the given config.

This command is special in that it is broadcast to all workers of a multi-worker replica. All subsequent commands, except UpdateConfiguration, are only sent to the first worker, which then distributes them to the other workers using a dataflow. This method of command distribution requires the timely dataflow runtime to be initialized, which is why the CreateTimely command exists.

The epoch value imposes an ordering on iterations of the compute protocol. When the compute controller connects to a replica, it must send an epoch that is greater than all epochs it sent to the same replica on previous connections. Multi-process replicas should use the epoch to ensure that their individual processes agree on which protocol iteration they are in.

Fields

§config: TimelyConfig

TODO(database-issues#7533): Add documentation.

§epoch: ClusterStartupEpoch

TODO(database-issues#7533): Add documentation.

§

CreateInstance(InstanceConfig)

CreateInstance must be sent after CreateTimely to complete the Creation Stage of the compute protocol. Unlike CreateTimely, it is only sent to the first worker of the replica, and then distributed through the timely runtime. CreateInstance instructs the replica to initialize its state to a point where it is ready to start maintaining dataflows.

Upon receiving a CreateInstance command, the replica must further initialize logging dataflows according to the given LoggingConfig.

§

InitializationComplete

InitializationComplete informs the replica about the end of the Initialization Stage. Upon receiving this command, the replica should perform a reconciliation process, to ensure its dataflow state matches the state requested by the computation commands it received previously. The replica must now start sending responses to commands received previously, if it opted to defer them during the Initialization Stage.

§

AllowWrites

AllowWrites informs the replica that it can transition out of the read-only computation stage and into the read-write computation stage. It is now allowed to affect changes to external systems (writes).

After initialization is complete, an instance starts out in the read-only computation stage. Only when receiving this command will it go out of that and allow running operations to do writes.

An instance that has once been told that it can go into read-write mode can never go out of that mode again. It is okay for a read-only controller to re-connect to an instance that is already in read-write mode: someone has already told the instance that it is okay to write and there is no way in the protocol to transition an instance back to read-only mode.

NOTE: We don’t have a protocol in place that allows writes only after a certain, controller-determined, timestamp. Such a protocol would allow tighter control and could allow the instance to avoid work. However, it is more work to put in place the logic for that so we leave it as future work for now.

§

UpdateConfiguration(ComputeParameters)

UpdateConfiguration instructs the replica to update its configuration, according to the given ComputeParameters.

This command is special in that, like CreateTimely, it is broadcast to all workers of the replica. However, unlike CreateTimely, it is ignored by all workers except the first one, which distributes the command to the other workers through the timely runtime. UpdateConfiguration commands are broadcast only to allow the intermediary parts of the networking fabric to observe them and learn of configuration updates.

Parameter updates transmitted through this command must be applied by the replica as soon as it receives the command, and they must be applied globally to all replica state, even dataflows and pending peeks that were created before the parameter update. This property allows the replica to hoist UpdateConfiguration commands during reconciliation.

Configuration parameters that should not be applied globally, but only to specific dataflows or peeks, should be added to the DataflowDescription or Peek types, rather than as ComputeParameters.

§

CreateDataflow(DataflowDescription<FlatPlan<T>, CollectionMetadata, T>)

CreateDataflow instructs the replica to create a dataflow according to the given DataflowDescription.

The DataflowDescription must have the following properties:

  • Dataflow imports are valid:
    • Imported storage collections specified in source_imports exist and are readable by the compute replica.
    • Imported indexes specified in index_imports have been created on the replica previously, by previous CreateDataflow commands.
  • Dataflow imports are readable at the specified as_of. In other words: The sinces of imported collections are not beyond the dataflow as_of.
  • Dataflow exports have unique IDs, i.e., the IDs of exports from dataflows a replica is instructed to create do not repeat (within a single protocol iteration).
  • The dataflow objects defined in objects_to_build are topologically ordered according to the dependency relation.

A dataflow description that violates any of the above properties can cause the replica to exhibit undefined behavior, such as panicking or production of incorrect results. A replica should prefer panicking over producing incorrect results.

After receiving a CreateDataflow command, if the created dataflow exports indexes or storage sinks, the replica must produce Frontiers responses that report the advancement of the frontiers of these compute collections.

After receiving a CreateDataflow command, if the created dataflow exports subscribes, the replica must produce SubscribeResponses that report the progress and results of the subscribes.

The replica may create the dataflow in a suspended state and defer starting the computation until it receives a corresponding Schedule command. Thus, to ensure dataflow execution, the compute controller should eventually send a Schedule command for each sent CreateDataflow command.

§

Schedule(GlobalId)

Schedule allows the replica to start computation for a compute collection.

It is invalid to send a Schedule command that references a collection that was not created by a corresponding CreateDataflow command before. Doing so may cause the replica to exhibit undefined behavior.

It is also invalid to send a Schedule command that references a collection that has, through an AllowCompaction command, been allowed to compact to the empty frontier before.

§

AllowCompaction

AllowCompaction informs the replica about the relaxation of external read capabilities on a compute collection exported by one of the replica’s dataflow.

The command names a collection and provides a frontier after which accumulations must be correct. The replica gains the liberty of compacting the corresponding maintained trace up through that frontier.

It is invalid to send an AllowCompaction command that references a compute collection that was not created by a corresponding CreateDataflow command before. Doing so may cause the replica to exhibit undefined behavior.

The AllowCompaction command only informs about external read requirements, not internal ones. The replica is responsible for ensuring that internal requirements are fulfilled at all times, so local dataflow inputs are not compacted beyond times at which they are still being read from.

The read frontiers transmitted through AllowCompactions may be beyond the corresponding collections’ current upper frontiers. This signals that external readers are not interested in times up to the specified new read frontiers. Consequently, an empty read frontier signals that external readers are not interested in updates from the corresponding collection ever again, so the collection is not required anymore.

Sending an AllowCompaction command with the empty frontier is the canonical way to drop compute collections.

A replica that receives an AllowCompaction command with the empty frontier must eventually respond with Frontiers responses reporting empty frontiers for the same collection. (#16271)

Fields

§id: GlobalId

TODO(database-issues#7533): Add documentation.

§frontier: Antichain<T>

TODO(database-issues#7533): Add documentation.

§

Peek(Peek<T>)

Peek instructs the replica to perform a peek on a collection: either an index or a Persist-backed collection.

The Peek description must have the following properties:

  • If targeting an index, it has previously been created by a corresponding CreateDataflow command. (If targeting a persist collection, that collection should exist.)
  • The Peek::uuid is unique, i.e., the UUIDs of peeks a replica gets instructed to perform do not repeat (within a single protocol iteration).

A Peek description that violates any of the above properties can cause the replica to exhibit undefined behavior.

Specifying a Peek::timestamp that is less than the target index’s since frontier does not provoke undefined behavior. Instead, the replica must produce a PeekResponse::Error in response.

After receiving a Peek command, the replica must eventually produce a single PeekResponse:

§

CancelPeek

CancelPeek instructs the replica to cancel the identified pending peek.

It is invalid to send a CancelPeek command that references a peek that was not created by a corresponding Peek command before. Doing so may cause the replica to exhibit undefined behavior.

If a replica cancels a peek in response to a CancelPeek command, it must respond with a PeekResponse::Canceled. The replica may also decide to fulfill the peek instead and return a different PeekResponse, or it may already have returned a response to the specified peek. In these cases it must not return another PeekResponse.

Fields

§uuid: Uuid

The identifier of the peek request to cancel.

This Value must match a Peek::uuid value transmitted in a previous Peek command.

Trait Implementations§

Source§

impl Arbitrary for ComputeCommand<Timestamp>

Source§

type Strategy = Union<BoxedStrategy<ComputeCommand>>

The type of Strategy used to generate values of type Self.
Source§

type Parameters = ()

The type of parameters that arbitrary_with accepts for configuration of the generated Strategy. Parameters must implement Default.
Source§

fn arbitrary_with(_: Self::Parameters) -> Self::Strategy

Generates a Strategy for producing arbitrary values of type the implementing type (Self). The strategy is passed the arguments given in args. Read more
Source§

fn arbitrary() -> Self::Strategy

Generates a Strategy for producing arbitrary values of type the implementing type (Self). Read more
Source§

impl<T: Clone> Clone for ComputeCommand<T>

Source§

fn clone(&self) -> ComputeCommand<T>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Debug> Debug for ComputeCommand<T>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<'de, T> Deserialize<'de> for ComputeCommand<T>
where T: Deserialize<'de>,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<T: Send> GenericClient<ComputeCommand<T>, ComputeResponse<T>> for Box<dyn ComputeClient<T>>

Source§

fn recv<'life0, 'async_trait>( &'life0 mut self, ) -> Pin<Box<dyn Future<Output = Result<Option<ComputeResponse<T>>, Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

§Cancel safety

This method is cancel safe. If recv is used as the event in a tokio::select! statement and some other branch completes first, it is guaranteed that no messages were received by this client.

Source§

fn send<'life0, 'async_trait>( &'life0 mut self, cmd: ComputeCommand<T>, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Sends a command to the dataflow server. Read more
Source§

fn as_stream<'a>( &'a mut self, ) -> Pin<Box<dyn Stream<Item = Result<R, Error>> + Send + 'a>>
where R: Send + 'a,

Returns an adapter that treats the client as a stream. Read more
Source§

impl<T> GenericClient<ComputeCommand<T>, ComputeResponse<T>> for SequentialHydration<T>

Source§

fn recv<'life0, 'async_trait>( &'life0 mut self, ) -> Pin<Box<dyn Future<Output = Result<Option<ComputeResponse<T>>, Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

§Cancel safety

This method is cancel safe. If recv is used as the event in a tokio::select! statement and some other branch completes first, it is guaranteed that no messages were received by this client.

Source§

fn send<'life0, 'async_trait>( &'life0 mut self, cmd: ComputeCommand<T>, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Sends a command to the dataflow server. Read more
Source§

fn as_stream<'a>( &'a mut self, ) -> Pin<Box<dyn Stream<Item = Result<R, Error>> + Send + 'a>>
where R: Send + 'a,

Returns an adapter that treats the client as a stream. Read more
Source§

impl<T: PartialEq> PartialEq for ComputeCommand<T>

Source§

fn eq(&self, other: &ComputeCommand<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T> Partitionable<ComputeCommand<T>, ComputeResponse<T>> for (ComputeCommand<T>, ComputeResponse<T>)

Source§

type PartitionedState = PartitionedComputeState<T>

The type which functions as the state machine for the partitioning.
Source§

fn new(parts: usize) -> PartitionedComputeState<T>

Construct a PartitionedState for the command–response pair.
Source§

impl<T> PartitionedState<ComputeCommand<T>, ComputeResponse<T>> for PartitionedComputeState<T>

Source§

fn split_command( &mut self, command: ComputeCommand<T>, ) -> Vec<Option<ComputeCommand<T>>>

Splits a command into multiple partitions.
Source§

fn absorb_response( &mut self, shard_id: usize, message: ComputeResponse<T>, ) -> Option<Result<ComputeResponse<T>, Error>>

Absorbs a response from a single partition. Read more
Source§

impl RustType<ProtoComputeCommand> for ComputeCommand<Timestamp>

Source§

fn into_proto(&self) -> ProtoComputeCommand

Convert a Self into a Proto value.
Source§

fn from_proto(proto: ProtoComputeCommand) -> Result<Self, TryFromProtoError>

Consume and convert a Proto back into a Self value. Read more
Source§

fn into_proto_owned(self) -> Proto

A zero clone version of Self::into_proto that types can optionally implement, otherwise, the default implementation delegates to Self::into_proto.
Source§

impl<T> Serialize for ComputeCommand<T>
where T: Serialize,

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl TryIntoTimelyConfig for ComputeCommand

Source§

fn try_into_timely_config( self, ) -> Result<(TimelyConfig, ClusterStartupEpoch), Self>

Attempt to unpack self into a (TimelyConfig, ClusterStartupEpoch). Otherwise, fail and return self back.
Source§

impl<T> StructuralPartialEq for ComputeCommand<T>

Auto Trait Implementations§

§

impl<T = Timestamp> !Freeze for ComputeCommand<T>

§

impl<T> RefUnwindSafe for ComputeCommand<T>
where T: RefUnwindSafe,

§

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

§

impl<T> Sync for ComputeCommand<T>
where T: Sync,

§

impl<T> Unpin for ComputeCommand<T>
where T: Unpin,

§

impl<T> UnwindSafe for ComputeCommand<T>

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, U> CastInto<U> for T
where U: CastFrom<T>,

Source§

fn cast_into(self) -> U

Performs the cast.
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> Conv for T

Source§

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

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

impl<T> DynClone for T
where T: Clone,

Source§

impl<T> FmtForward for T

Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> FutureExt for T

Source§

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

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

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
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> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

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

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
Source§

impl<T, U> OverrideFrom<Option<&T>> for U
where U: OverrideFrom<T>,

Source§

fn override_from(self, layer: &Option<&T>) -> U

Override the configuration represented by Self with values from the given layer.
Source§

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

Source§

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

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

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

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

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

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

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

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

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.
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> ProgressEventTimestamp for T
where T: Data + Debug + Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Upcasts this ProgressEventTimestamp to Any. Read more
Source§

fn type_name(&self) -> &'static str

Returns the name of the concrete type of this object. Read more
Source§

impl<P, R> ProtoType<R> for P
where R: RustType<P>,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<'a, S, T> Semigroup<&'a S> for T
where T: Semigroup<S>,

Source§

fn plus_equals(&mut self, rhs: &&'a S)

The method of std::ops::AddAssign, for types that do not implement AddAssign.
Source§

impl<T> Tap for T

Source§

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

Immutable access to a value. Read more
Source§

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

Mutable access to a value. Read more
Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryConv for T

Source§

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.
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> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Data for T
where T: Clone + 'static,

Source§

impl<T> Data for T
where T: Send + Sync + Any + Serialize + for<'a> Deserialize<'a> + 'static,

Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> ExchangeData for T
where T: Data + Data,