Skip to main content

UnsentCounts

Struct UnsentCounts 

Source
pub struct UnsentCounts {
    pub invite: u64,
    pub ack: u64,
    pub bye: u64,
    pub cancel: u64,
    pub other: u64,
}
Expand description

Requests the endpoint tried to put on the wire and could not, by method (§12.3).

Split by method because the consequence is. A CANCEL that does not go out leaves the far end ringing; an ACK that does not go out leaves a 2xx retransmitting for thirty-two seconds and then a peer streaming at a port this side has closed; a BYE that does not go out leaves a dialog up at the far end that no timer will reap. One number would hide which of those happened, and they are the three questions an operator asking “why did that call linger” is choosing between.

§Where this is counted, and why not at the hand-off

At the transmit, in the driver — the two places the socket is actually written: a transaction’s Output::Send, and the direct send that carries an ACK for a 2xx.

It was counted inside crate::Handle::send and crate::Handle::send_directly when X-54 first wrote it, and that was wrong in a way the type’s own documentation concealed. Handle::send returns as soon as the driver has created the transaction and handed back its key; the transmit happens afterwards. So a counter at that hand-off could only ever fire when the endpoint refused the request outright — a closed endpoint, or a request with no usable Via — and never on a refused connection, an unreachable peer or an over-MTU datagram, which is the whole of the question it claims to answer. send_directly did await the transmit, so ack behaved one way and bye and cancel another, with nothing saying so. Counting where the wire is missed makes all four mean the same thing.

§What this does and does not promise (§12.2)

  • Requests only. A response that fails to transmit is counted by DiscardCounts::send_failures and not here, because these fields are methods and a response has none.
  • This overlaps DiscardCounts::send_failures on purpose, and the two are views rather than tallies. A request that fails on the transaction path increments both: that field is the transaction path’s aggregate over requests and responses alike, this is the per-method breakdown over requests on any path. Adding them together is meaningless, and so is subtracting them — §12.2’s rule against arithmetic across fields applies here in particular.
  • An endpoint that is shutting down does not inflate this. A send that loses the race with shutdown fails at the hand-off, before any transmit is attempted, and is not counted — the earlier design counted it, which made an ordinary teardown look like lost signalling.

Fields§

§invite: u64

INVITEs the endpoint could not put on the wire.

§ack: u64

ACKs the endpoint could not put on the wire — RFC 3261 §13.2.2.4’s ACK for a 2xx, which has no transaction to retry it.

§bye: u64

BYEs the endpoint could not put on the wire. The one that leaves a call up at the far end.

§cancel: u64

CANCELs the endpoint could not put on the wire. The one that leaves a phone ringing.

§other: u64

Every other method the endpoint could not put on the wire.

Implementations§

Source§

impl UnsentCounts

Source

pub fn total(self) -> u64

Every request that did not reach the wire, of every method.

Trait Implementations§

Source§

impl Clone for UnsentCounts

Source§

fn clone(&self) -> UnsentCounts

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for UnsentCounts

Source§

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

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

impl Default for UnsentCounts

Source§

fn default() -> UnsentCounts

Returns the “default value” for a type. Read more
Source§

impl PartialEq for UnsentCounts

Source§

fn eq(&self, other: &UnsentCounts) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · 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 Copy for UnsentCounts

Source§

impl Eq for UnsentCounts

Source§

impl StructuralPartialEq for UnsentCounts

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<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

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

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

impl<T> Same for T

Source§

type Output = T

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

§

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

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,