pub enum QueueServiceReason {
NoQueueDeclaration,
NoLivePollers,
PollersIncompatible,
Saturated,
PollersUnreachable,
PollersAtCapacity,
PollersCapacityUnannounced,
}Expand description
Why a (namespace, task_queue, activity_type) address is not being served.
The names are R1’s, verbatim, and are the strings that reach logs, dispatch failures, and the queue-service accessor.
Variants§
NoQueueDeclaration
No deployed .v4 contract declares this task queue at all. Structural:
no worker can ever legitimately arrive for it, so it refuses
unconditionally under every policy.
NoLivePollers
The queue is declared (or its declaration is unknowable) and no worker is connected for the pool at all.
PollersIncompatible
Workers are connected for the pool but none of them covers this activity type, or none of them sits on the dispatch’s pinned node.
Saturated
A compatible worker is connected and its intake is refusing work: the task could not be handed over before the schedule-to-start clock expired.
PollersUnreachable
Workers are connected and DO serve this activity on this node, but the liveness verdict has withdrawn dispatch eligibility from all of them after losing reachability.
🔴 Distinct from Self::PollersIncompatible because the remedies are
close to opposite. Incompatible pollers need a worker deployed that
covers the activity; these workers already cover it, and deploying
another changes nothing — the fault is on the wire to the ones already
there. Distinct from an opening probation, which is not reported at all
because it clears itself within seconds.
PollersAtCapacity
Workers are connected, DO serve this activity on this node, and every one of them is already running every activity it advertised it would run at once. The work is queued and starts as capacity frees.
🔴 The one reason in this taxonomy that describes a HEALTHY fleet, which
is why it could not be folded into any of the others. Every existing
sentence here would be a lie about a busy pool: nothing is missing, no
wire has failed, no deployment is absent. Its remedy is the exact
opposite of Self::PollersUnreachable’s — starting another worker
helps here and does not help there — and two opposite pieces of advice
cannot share one name. (Self::NoLivePollers shares the remedy but not
the diagnosis: there the pool is empty, here it is full and working.)
PollersCapacityUnannounced
Workers are connected and DO serve this activity on this node, at least one of them has not announced how much work it can take, and no worker whose capacity IS known has a free slot — so the server has nothing it can honestly select against.
Reported on > 0 rather than on the whole population, and it OUTRANKS
Self::PollersAtCapacity in super::census::classify. Both
conditions can hold of one pool at once, only one reason can be
published, and this is the one that may need an operator: a busy pool
clears itself as work completes, a mute worker does not.
🔴 NOT a quieter Self::PollersAtCapacity, and the distinction is the
whole reason this variant exists. Selection excludes an unannounced
worker by treating unknown capacity as full — the safe direction, since
the alternative is inventing a number for a process that is about to
state its own — but reporting that exclusion as “at capacity” would tell
an operator their fleet was busy when it is idle and mute. The advice
attached to a busy pool (“start another worker, or raise concurrency”)
is actively wrong here: another worker of the same build will be just as
silent.
Ordinarily invisible. It is true for exactly one round trip after a liminal worker registers, and a dispatch has to miss inside that window to see it. Persisting past that is the signal: the worker is an older build that does not announce, or its announcement was lost.
Implementations§
Source§impl QueueServiceReason
impl QueueServiceReason
Sourcepub const ALL: [Self; 7]
pub const ALL: [Self; 7]
Every variant, and the single source of that set.
🔴 Self::parse and the round-trip test both read THIS, so a variant
missing here is a variant that cannot be parsed back from its own
spelling — a wire value the server writes and then fails to read. The
exhaustive match in Self::as_str forces a new variant to be given
a spelling, but nothing forces it into this list; all_lists_every_variant
is what does, by matching exhaustively so the compiler refuses a variant
this list has not been told about.
Sourcepub const fn is_structural(self) -> bool
pub const fn is_structural(self) -> bool
Whether the unservability is structural — provable from the deployed contract records alone, unchangeable by waiting or retrying.
Sourcepub fn explain(self, address: &ServiceAddress) -> String
pub fn explain(self, address: &ServiceAddress) -> String
The operator-facing sentence for this reason at address: what has to
be fixed, in words.
This is the single source of that sentence. The dispatch refusal’s human
tail (WorkerUnavailable::explain) and the describe projection’s
detail both read it here, so a queue that is unserved cannot be
explained one way in a refusal and another way in a read.
Trait Implementations§
Source§impl Clone for QueueServiceReason
impl Clone for QueueServiceReason
Source§fn clone(&self) -> QueueServiceReason
fn clone(&self) -> QueueServiceReason
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for QueueServiceReason
Source§impl Debug for QueueServiceReason
impl Debug for QueueServiceReason
Source§impl Display for QueueServiceReason
impl Display for QueueServiceReason
impl Eq for QueueServiceReason
Source§impl Hash for QueueServiceReason
impl Hash for QueueServiceReason
Source§impl Ord for QueueServiceReason
impl Ord for QueueServiceReason
Source§fn cmp(&self, other: &QueueServiceReason) -> Ordering
fn cmp(&self, other: &QueueServiceReason) -> Ordering
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialEq for QueueServiceReason
impl PartialEq for QueueServiceReason
Source§impl PartialOrd for QueueServiceReason
impl PartialOrd for QueueServiceReason
impl StructuralPartialEq for QueueServiceReason
Auto Trait Implementations§
impl Freeze for QueueServiceReason
impl RefUnwindSafe for QueueServiceReason
impl Send for QueueServiceReason
impl Sync for QueueServiceReason
impl Unpin for QueueServiceReason
impl UnsafeUnpin for QueueServiceReason
impl UnwindSafe for QueueServiceReason
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
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> IntoMaybeUndefined<T> for T
impl<T> IntoMaybeUndefined<T> for T
Source§fn into_maybe_undefined(self) -> MaybeUndefined<T>
fn into_maybe_undefined(self) -> MaybeUndefined<T>
Source§impl<T> IntoOption<T> for T
impl<T> IntoOption<T> for T
Source§fn into_option(self) -> Option<T>
fn into_option(self) -> Option<T>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request