pub struct BeaconConsensusEngine<N, BT, Client>where
N: EngineNodeTypes,
Client: EthBlockClient,
BT: BlockchainTreeEngine + BlockReader + BlockIdReader + CanonChainTracker + StageCheckpointReader,{ /* private fields */ }
Expand description
The beacon consensus engine is the driver that switches between historical and live sync.
The beacon consensus engine is itself driven by messages from the Consensus Layer, which are received by Engine API (JSON-RPC).
The consensus engine is idle until it receives the first
[BeaconEngineMessage::ForkchoiceUpdated
] message from the CL which would initiate the sync. At
first, the consensus engine would run the [Pipeline] until the latest known block hash.
Afterward, it would attempt to create/restore the BlockchainTreeEngine
from the blocks
that are currently available. In case the restoration is successful, the consensus engine would
run in a live sync mode, populating the BlockchainTreeEngine
with new blocks as they arrive
via engine API and downloading any missing blocks from the network to fill potential gaps.
The consensus engine has two data input sources:
§New Payload (engine_newPayloadV{}
)
The engine receives new payloads from the CL. If the payload is connected to the canonical
chain, it will be fully validated added to a chain in the BlockchainTreeEngine
: VALID
If the payload’s chain is disconnected (at least 1 block is missing) then it will be buffered:
SYNCING
(BlockStatus::Disconnected
).
§Forkchoice Update (FCU) (engine_forkchoiceUpdatedV{}
)
This contains the latest forkchoice state and the payload attributes. The engine will attempt to
make a new canonical chain based on the head_hash
of the update and trigger payload building
if the payload_attrs
are present and the FCU is VALID
.
The head_hash
forms a chain by walking backwards from the head_hash
towards the canonical
blocks of the chain.
Making a new canonical chain can result in the following relevant outcomes:
§The chain is connected
All blocks of the head_hash
’s chain are present in the BlockchainTreeEngine
and are
committed to the canonical chain. This also includes reorgs.
§The chain is disconnected
In this case the BlockchainTreeEngine
doesn’t know how the new chain connects to the
existing canonical chain. It could be a simple commit (new blocks extend the current head) or a
re-org that requires unwinding the canonical chain.
This further distinguishes between two variants:
§head_hash
’s block exists
The head_hash
’s block was already received/downloaded, but at least one block is missing to
form a connected chain. The engine will attempt to download the missing blocks from the
network by walking backwards (parent_hash
), and then try to make the block canonical as soon
as the chain becomes connected.
However, it still can be the case that the chain and the FCU is INVALID
.
§head_hash
block is missing
This is similar to the previous case, but the head_hash
’s block is missing. At which point the
engine doesn’t know where the new head will point to: new chain could be a re-org or a simple
commit. The engine will download the missing head first and then proceed as in the previous
case.
§Panics
If the future is polled more than once. Leads to undefined state.
Note: soon deprecated. See reth_engine_service::EngineService
.
Implementations§
Source§impl<N, BT, Client> BeaconConsensusEngine<N, BT, Client>where
N: TreeNodeTypes,
BT: BlockchainTreeEngine + BlockReader<Block = BlockTy<N>, Header = HeaderTy<N>> + BlockIdReader + CanonChainTracker<Header = HeaderTy<N>> + StageCheckpointReader + ChainSpecProvider<ChainSpec = N::ChainSpec> + 'static,
Client: EthBlockClient + 'static,
impl<N, BT, Client> BeaconConsensusEngine<N, BT, Client>where
N: TreeNodeTypes,
BT: BlockchainTreeEngine + BlockReader<Block = BlockTy<N>, Header = HeaderTy<N>> + BlockIdReader + CanonChainTracker<Header = HeaderTy<N>> + StageCheckpointReader + ChainSpecProvider<ChainSpec = N::ChainSpec> + 'static,
Client: EthBlockClient + 'static,
Sourcepub fn new(
client: Client,
pipeline: Pipeline<N>,
blockchain: BT,
task_spawner: Box<dyn TaskSpawner>,
sync_state_updater: Box<dyn NetworkSyncUpdater>,
max_block: Option<BlockNumber>,
payload_builder: PayloadBuilderHandle<N::Engine>,
target: Option<B256>,
pipeline_run_threshold: u64,
hooks: EngineHooks,
) -> RethResult<(Self, BeaconConsensusEngineHandle<N::Engine>)>
pub fn new( client: Client, pipeline: Pipeline<N>, blockchain: BT, task_spawner: Box<dyn TaskSpawner>, sync_state_updater: Box<dyn NetworkSyncUpdater>, max_block: Option<BlockNumber>, payload_builder: PayloadBuilderHandle<N::Engine>, target: Option<B256>, pipeline_run_threshold: u64, hooks: EngineHooks, ) -> RethResult<(Self, BeaconConsensusEngineHandle<N::Engine>)>
Create a new instance of the BeaconConsensusEngine
.
Sourcepub fn with_channel(
client: Client,
pipeline: Pipeline<N>,
blockchain: BT,
task_spawner: Box<dyn TaskSpawner>,
sync_state_updater: Box<dyn NetworkSyncUpdater>,
max_block: Option<BlockNumber>,
payload_builder: PayloadBuilderHandle<N::Engine>,
target: Option<B256>,
pipeline_run_threshold: u64,
to_engine: UnboundedSender<BeaconEngineMessage<N::Engine>>,
engine_message_stream: BoxStream<'static, BeaconEngineMessage<N::Engine>>,
hooks: EngineHooks,
) -> RethResult<(Self, BeaconConsensusEngineHandle<N::Engine>)>
pub fn with_channel( client: Client, pipeline: Pipeline<N>, blockchain: BT, task_spawner: Box<dyn TaskSpawner>, sync_state_updater: Box<dyn NetworkSyncUpdater>, max_block: Option<BlockNumber>, payload_builder: PayloadBuilderHandle<N::Engine>, target: Option<B256>, pipeline_run_threshold: u64, to_engine: UnboundedSender<BeaconEngineMessage<N::Engine>>, engine_message_stream: BoxStream<'static, BeaconEngineMessage<N::Engine>>, hooks: EngineHooks, ) -> RethResult<(Self, BeaconConsensusEngineHandle<N::Engine>)>
Create a new instance of the BeaconConsensusEngine
using the given channel to configure
the [BeaconEngineMessage
] communication channel.
By default the engine is started with idle pipeline. The pipeline can be launched immediately in one of the following ways descending in priority:
- Explicit
Option::Some
target block hash provided via a constructor argument. - The process was previously interrupted amidst the pipeline run. This is checked by
comparing the checkpoints of the first (
StageId::Headers
) and last (StageId::Finish
) stages. In this case, the latest available header in the database is used as the target.
Propagates any database related error.
Sourcepub fn handle(&self) -> BeaconConsensusEngineHandle<N::Engine>
pub fn handle(&self) -> BeaconConsensusEngineHandle<N::Engine>
Returns a new BeaconConsensusEngineHandle
that can be cloned and shared.
The BeaconConsensusEngineHandle
can be used to interact with this
BeaconConsensusEngine
Trait Implementations§
Source§impl<N, BT, Client> Future for BeaconConsensusEngine<N, BT, Client>where
N: TreeNodeTypes,
Client: EthBlockClient + 'static,
BT: BlockchainTreeEngine + BlockReader<Block = BlockTy<N>, Header = HeaderTy<N>> + BlockIdReader + CanonChainTracker<Header = HeaderTy<N>> + StageCheckpointReader + ChainSpecProvider<ChainSpec = N::ChainSpec> + Unpin + 'static,
On initialization, the consensus engine will poll the message receiver and return
Poll::Pending
until the first forkchoice update message is received.
impl<N, BT, Client> Future for BeaconConsensusEngine<N, BT, Client>where
N: TreeNodeTypes,
Client: EthBlockClient + 'static,
BT: BlockchainTreeEngine + BlockReader<Block = BlockTy<N>, Header = HeaderTy<N>> + BlockIdReader + CanonChainTracker<Header = HeaderTy<N>> + StageCheckpointReader + ChainSpecProvider<ChainSpec = N::ChainSpec> + Unpin + 'static,
On initialization, the consensus engine will poll the message receiver and return
Poll::Pending
until the first forkchoice update message is received.
As soon as the consensus engine receives the first forkchoice updated message and updates the local forkchoice state, it will launch the pipeline to sync to the head hash. While the pipeline is syncing, the consensus engine will keep processing messages from the receiver and forwarding them to the blockchain tree.
Auto Trait Implementations§
impl<N, BT, Client> !Freeze for BeaconConsensusEngine<N, BT, Client>
impl<N, BT, Client> !RefUnwindSafe for BeaconConsensusEngine<N, BT, Client>
impl<N, BT, Client> Send for BeaconConsensusEngine<N, BT, Client>where
<<N as NodeTypes>::Primitives as NodePrimitives>::BlockHeader: Sized,
<<N as NodeTypes>::Primitives as NodePrimitives>::Receipt: Sized,
<<N as NodeTypes>::Primitives as NodePrimitives>::SignedTx: Sized,
<N as NodeTypes>::Primitives: Sized,
<<N as NodeTypes>::Primitives as NodePrimitives>::BlockBody: Sized,
<<N as NodeTypes>::Primitives as NodePrimitives>::Block: Sized,
<N as NodeTypes>::ChainSpec: Sized,
impl<N, BT, Client> !Sync for BeaconConsensusEngine<N, BT, Client>
impl<N, BT, Client> Unpin for BeaconConsensusEngine<N, BT, Client>where
<<N as NodeTypes>::Primitives as NodePrimitives>::BlockHeader: Sized,
<<N as NodeTypes>::Primitives as NodePrimitives>::Receipt: Sized,
<<N as NodeTypes>::Primitives as NodePrimitives>::SignedTx: Sized,
<N as NodeTypes>::Primitives: Sized,
<<N as NodeTypes>::Primitives as NodePrimitives>::BlockBody: Sized,
<<N as NodeTypes>::Primitives as NodePrimitives>::Block: Sized,
<N as NodeTypes>::ChainSpec: Sized,
BT: Unpin,
impl<N, BT, Client> !UnwindSafe for BeaconConsensusEngine<N, BT, Client>
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 map<U, F>(self, f: F) -> Map<Self, F>
fn map<U, F>(self, f: F) -> Map<Self, F>
§fn map_into<U>(self) -> MapInto<Self, U>
fn map_into<U>(self) -> MapInto<Self, U>
§fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
fn then<Fut, F>(self, f: F) -> Then<Self, Fut, F>
f
. Read more§fn left_future<B>(self) -> Either<Self, B>
fn left_future<B>(self) -> Either<Self, B>
§fn right_future<A>(self) -> Either<A, Self>
fn right_future<A>(self) -> Either<A, Self>
§fn into_stream(self) -> IntoStream<Self>where
Self: Sized,
fn into_stream(self) -> IntoStream<Self>where
Self: Sized,
§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
§fn flatten_stream(self) -> FlattenStream<Self>
fn flatten_stream(self) -> FlattenStream<Self>
§fn fuse(self) -> Fuse<Self>where
Self: Sized,
fn fuse(self) -> Fuse<Self>where
Self: Sized,
poll
will never again be called once it has
completed. This method can be used to turn any Future
into a
FusedFuture
. Read more§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
§fn catch_unwind(self) -> CatchUnwind<Self>where
Self: Sized + UnwindSafe,
fn catch_unwind(self) -> CatchUnwind<Self>where
Self: Sized + UnwindSafe,
std
only.std
only.§fn remote_handle(self) -> (Remote<Self>, RemoteHandle<Self::Output>)where
Self: Sized,
fn remote_handle(self) -> (Remote<Self>, RemoteHandle<Self::Output>)where
Self: Sized,
channel
and std
only.()
on completion and sends
its output to another future on a separate task. Read more§fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
fn boxed<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>
alloc
only.§fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>where
Self: Sized + 'a,
fn boxed_local<'a>(self) -> Pin<Box<dyn Future<Output = Self::Output> + 'a>>where
Self: Sized + 'a,
alloc
only.§fn unit_error(self) -> UnitError<Self>where
Self: Sized,
fn unit_error(self) -> UnitError<Self>where
Self: Sized,
Future<Output = T>
into a
TryFuture<Ok = T, Error = ()
>.§fn never_error(self) -> NeverError<Self>where
Self: Sized,
fn never_error(self) -> NeverError<Self>where
Self: Sized,
Future<Output = T>
into a
TryFuture<Ok = T, Error = Never
>.§impl<T> FutureExt for T
impl<T> FutureExt for T
§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> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreSource§impl<F> IntoFuture for Fwhere
F: Future,
impl<F> IntoFuture for Fwhere
F: Future,
Source§type IntoFuture = F
type IntoFuture = F
Source§fn into_future(self) -> <F as IntoFuture>::IntoFuture
fn into_future(self) -> <F as IntoFuture>::IntoFuture
§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> 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.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<F, T, E> TryFuture for F
impl<F, T, E> TryFuture for F
§impl<Fut> TryFutureExt for Futwhere
Fut: TryFuture + ?Sized,
impl<Fut> TryFutureExt for Futwhere
Fut: TryFuture + ?Sized,
§fn flatten_sink<Item>(self) -> FlattenSink<Self, Self::Ok>where
Self::Ok: Sink<Item, Error = Self::Error>,
Self: Sized,
fn flatten_sink<Item>(self) -> FlattenSink<Self, Self::Ok>where
Self::Ok: Sink<Item, Error = Self::Error>,
Self: Sized,
sink
only.Sink
]. Read more§fn map_ok<T, F>(self, f: F) -> MapOk<Self, F>
fn map_ok<T, F>(self, f: F) -> MapOk<Self, F>
§fn map_ok_or_else<T, E, F>(self, e: E, f: F) -> MapOkOrElse<Self, F, E>
fn map_ok_or_else<T, E, F>(self, e: E, f: F) -> MapOkOrElse<Self, F, E>
§fn map_err<E, F>(self, f: F) -> MapErr<Self, F>
fn map_err<E, F>(self, f: F) -> MapErr<Self, F>
§fn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F>
fn and_then<Fut, F>(self, f: F) -> AndThen<Self, Fut, F>
§fn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F>
fn or_else<Fut, F>(self, f: F) -> OrElse<Self, Fut, F>
§fn inspect_ok<F>(self, f: F) -> InspectOk<Self, F>
fn inspect_ok<F>(self, f: F) -> InspectOk<Self, F>
§fn inspect_err<F>(self, f: F) -> InspectErr<Self, F>
fn inspect_err<F>(self, f: F) -> InspectErr<Self, F>
§fn try_flatten(self) -> TryFlatten<Self, Self::Ok>where
Self::Ok: TryFuture<Error = Self::Error>,
Self: Sized,
fn try_flatten(self) -> TryFlatten<Self, Self::Ok>where
Self::Ok: TryFuture<Error = Self::Error>,
Self: Sized,
§fn try_flatten_stream(self) -> TryFlattenStream<Self>where
Self::Ok: TryStream<Error = Self::Error>,
Self: Sized,
fn try_flatten_stream(self) -> TryFlattenStream<Self>where
Self::Ok: TryStream<Error = Self::Error>,
Self: Sized,
§fn unwrap_or_else<F>(self, f: F) -> UnwrapOrElse<Self, F>
fn unwrap_or_else<F>(self, f: F) -> UnwrapOrElse<Self, F>
§fn into_future(self) -> IntoFuture<Self>where
Self: Sized,
fn into_future(self) -> IntoFuture<Self>where
Self: Sized,
§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.