Skip to main content

DispatchReservation

Struct DispatchReservation 

Source
pub struct DispatchReservation { /* private fields */ }
Expand description

One capacity slot on one worker, held from selection until it is dropped.

Returned by ConnectedWorkerRegistry::select_and_reserve. Dropping it releases the slot and wakes the selection waits, exactly as a completion does — so a dispatch that dies anywhere between choosing its worker and handing the count to the heartbeat tracker gives the slot back without that path having to know a slot existed. That is the whole point: the release is owed by the type, not by every error arm.

§Handing the slot over: Self::commit, and why it exists now

This type used to forbid a commit/forget escape, on the reasoning that the tracker’s own increment would carry the slot afterwards and the two would merely overlap “for the width of one call”. That was measured and it was wrong in a way that mattered.

The overlap is two separate acquisitions of the registry lock — the tracker increments under one, this type’s Drop decrements under another — and between them the worker’s in_flight reads ONE HIGHER than the number of dispatches it is actually holding. A concurrent leg that lands in that window asks ConnectedWorkerRegistry::reserve_worker, is told held >= advertised, and is refused a slot the worker demonstrably has. Observed directly: in_flight = 5 on a worker advertising 4, on a fan sized exactly to its pool — which is the normal shape, so the margin is zero and one collision is enough.

So the handover is now a single act with no intermediate state: Self::commit disarms this reservation and the tracker skips its own increment, because the slot this reservation already holds IS the slot the tracked dispatch holds. The count goes 1 → 1 rather than 1 → 2 → 1, and never passes through a value that is not true.

The original worry — a missed handoff silently under-counting a busy worker forever — is answered by making the transfer the ONLY way to commit: the tracker takes the reservation by value, so it either commits it or drops it, and a dropped reservation still releases.

Implementations§

Source§

impl DispatchReservation

Source

pub fn worker_id(&self) -> WorkerId

The worker whose slot this reservation holds.

Trait Implementations§

Source§

impl Debug for DispatchReservation

Source§

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

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

impl Drop for DispatchReservation

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
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§

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> IntoMaybeUndefined<T> for T

Source§

fn into_maybe_undefined(self) -> MaybeUndefined<T>

Converts this value into a three-state builder argument.
Source§

impl<T> IntoOption<T> for T

Source§

fn into_option(self) -> Option<T>

Converts this value into an optional builder argument.
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<L> LayerExt<L> for L

Source§

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.
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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

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