pub struct HealthResponse {
pub node_id: String,
pub uptime_s: u64,
pub in_flight_streams: u64,
pub binding: BindingStatus,
pub bound_node_id: Option<String>,
pub registry_active: bool,
}Expand description
Response body for admin_v1_health. Shared between the server
(serializes) and decdn node health (deserializes via the generated
client). Intentionally minimal: this method exists so an operator
script can answer “is this admin port the node I think it is, and
has it been up since I started watching?” with one RPC call.
Fields§
§node_id: StringLowercase hex of this node’s iroh PublicKey.
uptime_s: u64Whole seconds since the runtime captured the process-start
Instant at the top of decdn-node run (before any await,
before the RPC preflight). Computed from a monotonic Instant
so wall-clock skew can’t produce a negative or non-monotonic
value.
in_flight_streams: u64Currently in-flight QUIC handler tasks holding a dispatch permit
(read off the decdn_dispatch_in_flight gauge — see
ConnectionLimiter in decdn-node). Polled by decdn node drain --wait (issue #604) to detect when all client streams have
completed during a graceful drain.
binding: BindingStatusWhether node_id is the key bound to this operator on-chain (#1034).
Sampled once at bring-up — the binding only changes by an explicit
operator transaction, and re-reading it on every health poll would put
an RPC round trip behind the readiness probe.
bound_node_id: Option<String>Lowercase hex of the node id the operator IS bound to, when that could
be read. Present for BindingStatus::Bound (where it equals
node_id) and, more usefully, for BindingStatus::Mismatch, where it
names the key to restore. None for Unbound and Unknown.
registry_active: boolWhether this node is in the on-chain active-staker set right now (ADR 019 §Phase 4, criterion 1; #1030).
Purely diagnostic. The daemon does not gate delivery on it — a node
policing its own registration constrains only operators who were never
the threat (see ADR 019 §How criterion 1 is enforced). What false
means is that the two EXTERNAL constraints are in force: the operator
accrues no governance weight, because its declared capacity caps
credited bytes at zero, and peers have no reason to route to a node they
cannot slash.
Unlike Self::binding, this is read LIVE on every poll — it is a
lookup in the registry projection the daemon already keeps current off
CapacityBond events, not a chain round trip — so an operator who has
just run decdn setup watches it flip to true without restarting the
daemon.
false is the answer to “my node is up and healthy, why is it earning
nothing”. Nothing on the wire says so; the traffic simply does not
arrive. The cause is one of never registered, registered under a key
this process no longer holds (see Self::binding), deregistered,
ejected, bond below minBond, or an unbonding request in flight.
Trait Implementations§
Source§impl Clone for HealthResponse
impl Clone for HealthResponse
Source§impl Debug for HealthResponse
impl Debug for HealthResponse
Source§impl<'de> Deserialize<'de> for HealthResponse
impl<'de> Deserialize<'de> for HealthResponse
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for HealthResponse
impl RefUnwindSafe for HealthResponse
impl Send for HealthResponse
impl Sync for HealthResponse
impl Unpin for HealthResponse
impl UnsafeUnpin for HealthResponse
impl UnwindSafe for HealthResponse
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<'de, T> BorrowedRpcObject<'de> for T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
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 more