Skip to main content

Actor

Struct Actor 

Source
struct Actor {
Show 35 fields io: Arc<dyn WalObjectIo>, started_regions: Arc<Mutex<HashSet<RegionId>>>, withdrawal: Withdrawal, catalog: Arc<RwLock<ObjectCatalog>>, obsolete_entry_ids: Arc<Mutex<HashMap<RegionId, EntryId>>>, wal_holes: Arc<Mutex<HashMap<RegionId, BTreeMap<u64, WalHole>>>>, 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>>), Instant)>, failing: Option<Failing>, durable_waiters: Vec<DurableWaiter>, stop: Vec<Sender<Result<()>>>, stop_error: Option<Arc<Error>>, next_object_seq: Option<u64>, epoch: u64, last_indexed: ChainLink, reclaim_boundary: u64, durable_reclaim_boundary: u64, unindexed: BTreeSet<u64>, failed_releases: BTreeMap<RegionId, EntryId>, creating: HashSet<u64>, deleting: Arc<DeletingObjects>, deletes: FuturesUnordered<BoxFuture<'static, (u64, Result<()>)>>, failed_deletes: HashSet<u64>, 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 acknowledged, except a release, which waits for the repeathealthy: the create is repeated with the same bytes after CREATE_RETRY_DELAY, which an identical retry accepts
error that requires intervention, enqueued modeunchangedalready acknowledged, except a release, which fails while its record stays in the backlog; later appends and releases are rejected with a retryable errorfailing, see Failing: the lowest pending create is repeated alone with backoff, and the first create that succeeds ends it
object store error, enqueued mode after stop begannever reusedalready acknowledged, except a release, which fails with the stopped errorthe 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 and the durable mode creates one object with the release records of failed batches; creates in flight run to completion and acknowledge if they succeed.

Appends arrive on their own channel. The actor holds one back while the sealed batches leave no room for the two an admission can seal, or at a backlog threshold of the enqueued mode, and does not read the channel meanwhile, so commands such as stop are handled while admission is held back. A failing store reads the channel to reject every append.

The actor also collects garbage. Every batch carries the reclaim boundary current when it was sealed, see ObjectCatalog::reclaim_boundary, which is recomputed after every obsolete, every release and every indexed object and never moves down. The boundary of the last indexed object is durable: every present object below it, indexed or not, is deleted in the background, up to MAX_IN_FLIGHT_DELETES at a time, after an obsolete, a release or an indexing that moved it. An indexed object is unindexed once its delete succeeded; a failed delete is attempted again at the next collection. Nothing is collected once stop began or the store is poisoned, and deletes in flight complete before stop returns.

Fields§

§io: Arc<dyn WalObjectIo>§started_regions: Arc<Mutex<HashSet<RegionId>>>§withdrawal: Withdrawal§catalog: Arc<RwLock<ObjectCatalog>>§obsolete_entry_ids: Arc<Mutex<HashMap<RegionId, EntryId>>>§wal_holes: Arc<Mutex<HashMap<RegionId, BTreeMap<u64, WalHole>>>>§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>>), Instant)>

The append held back while the sealed batches are full or, in the enqueued mode, the unpersisted backlog is at a threshold, and when it was held back. Later appends wait in their channel.

§failing: Option<Failing>

Set while the object store refuses the enqueued backlog with an error that requires intervention.

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

§reclaim_boundary: u64

The reclaim boundary the next sealed batch carries.

§durable_reclaim_boundary: u64

The reclaim boundary of the last indexed object.

§unindexed: BTreeSet<u64>

Sequences of objects that may be present but are not indexed: the objects recovery listed off the chain and the batches that failed.

§failed_releases: BTreeMap<RegionId, EntryId>

Release records of batches that failed, which the next sealed batch carries again, so a release whose call failed still becomes durable while the store runs. A timer tick seals them when no entry is admitted.

§creating: HashSet<u64>

Sequences whose create is in flight.

§deleting: Arc<DeletingObjects>§deletes: FuturesUnordered<BoxFuture<'static, (u64, Result<()>)>>§failed_deletes: HashSet<u64>

Deletes that failed since the last collection started.

§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 should_hold_back(&self) -> bool

Returns true while an append has to wait for an upload: the sealed batches leave no room for the two an admission can seal, or in the enqueued mode the unpersisted backlog is at a threshold.

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 it no longer has to be held back.

Source

fn take_stalled( &mut self, ) -> Option<(Vec<Entry>, Sender<Result<AppendBatchResponse>>)>

Takes the held-back append out on whichever path releases it and records how long it was held back.

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 seal(&mut self, releases: Vec<Release>) -> bool

Seals the open batch together with releases and the release records of failed batches as the object next_object_seq, even when the open batch holds no entry, and starts its create when a slot is free. Returns whether a batch was sealed.

A failing store keeps the records of failed batches coalesced instead of sealing them alone behind its backlog on every tick, until stop seals them for its last attempt of the backlog.

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 and, once the stop command was handled, the release records handle_stop seals in the durable mode. A failing store only schedules the next attempt once nothing is in flight, see Failing; after stop began it uploads its backlog at once.

Source

fn probe(&mut self)

Attempts the lowest pending batch of a failing store, whose delay elapsed. After stop began start_creates uploads the backlog instead.

Source

fn start_create(&mut self, index: usize, delay: Duration)

Starts the create of the sealed batch at index after delay.

Source

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

Source

fn on_create_failed(&mut self, error: Error)

Records the failure of a create the enqueued mode repeats. An error that requires intervention makes the store failing; while it is, every error becomes the one rejected appends carry.

Source

fn enter_failing(&mut self, error: Error)

Source

fn leave_failing(&mut self, reason: &str)

Ends the failing state, if the store is in it, because of reason.

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 keep_releases(&mut self, batch: &mut SealedBatch)

Keeps the release records of a batch that failed for the next sealed batch.

Source

fn keep_release(&mut self, release: Release)

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 fail_waiters(&mut self, error: impl Fn() -> Error)

Fails the waiters of the open batch and the durability waiters.

Source

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

Source

fn handle_withdraw(&mut self, response: Sender<()>)

Gives up the start object while it is the only object this store knows of: the catalog indexes nothing else, nothing was ever handed an id, no batch, append or release waits, no other object was listed or created, no region’s history started in the store, and the store is neither failing nor terminal. A release seals its own batch without handing an id, so the catalog decides once its object is indexed, and the object it may then leave alone holds a segment. The store then records a terminal error, so nothing is admitted that would link to the object, and deletes it like a collected object; response is answered once that delete settled, or at once when the store keeps the object. A later request waits for the same delete.

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 handle_release( &mut self, region_id: RegionId, full: bool, response: Sender<Result<()>>, )

Moves the watermark of the region up to the release and seals the open batch with a release record of the region; response is answered once that object is durable and indexed. The batch carries the reclaim boundary the watermark allows, so the object makes both durable at once.

The watermark is not clamped to the durable entry id in the enqueued mode: a released region is never replayed, and the record is durable only once every object sealed before it is. A release arrives as a command, so MAX_SEALED_BATCHES does not hold it back; every caller waits for its own object, so releases add at most one batch per caller.

Source

fn update_reclaim_boundary(&mut self)

Raises the reclaim boundary to what the catalog and the obsolete watermarks allow.

Source

fn collect(&mut self)

Starts a collection, which also attempts the deletes that failed since the last one again.

Source

fn start_deletes(&mut self)

Starts deleting the objects below the durable reclaim boundary while fewer than MAX_IN_FLIGHT_DELETES deletes are in flight, skipping objects whose create is in flight or whose delete failed since the collection started.

Source

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

Unindexes the object object_seq and drops its holes once its delete succeeded, then settles its attempt, so a read that the attempt releases sees the outcome in the catalog.

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 and the append held back is refused; the durable mode drops the open batch and the batches whose create has not started, and seals the release records of failed and dropped batches once more; the enqueued mode seals its backlog and uploads it, a failing store included. 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 and delete has completed. Returns true when the actor is done.

Source

fn is_stopped(&self) -> bool

Trait Implementations§

Source§

impl Drop for Actor

Source§

fn drop(&mut self)

Settles the deletes the actor still had in flight, so no read waits for an attempt that will never complete, and releases the append still held back, whose caller is gone or about to be.

Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

§

impl !Freeze for Actor

§

impl !RefUnwindSafe for Actor

§

impl !Sync for Actor

§

impl !UnwindSafe for Actor

§

impl Send for Actor

§

impl Unpin for Actor

§

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

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

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> ErasedDestructor for T
where T: 'static,

§

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> MaybeSend for T
where T: Send,

§

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

§

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: Sized + 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: Sized + 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