Health surfaces
Key fields on
/health/detailed:
block_height— latest finalized height. Compare against a healthy peer to detect lag.last_block_timestamp— Unix time of the latest finalized block. A growing gap between this and now means the node is stalled (not finalizing).mempool_transaction_count— the top-levelstatusflips to"degraded"(and themempoolcomponent to"degraded") at ≥ 30,000 pending transactions.synced— currently hard-codedtrue; it is not a real sync flag. Judge sync state fromblock_heightvs a peer and thelast_block_timestampgap, not from this field.
Decision tree
Symptom: height not advancing (stalled)
last_block_timestamp is minutes old and block_height is flat.
- Check
GET /health/detailedon the other validators. If they are advancing, this node is partitioned or behind — go to lagging height. - If no validator is advancing, consensus has stalled network-wide
(insufficient online stake to certify). Recover quorum: bring offline
validators back; the protocol resumes automatically once enough are live
(view-change retries every
NULLIFY_RETRY= 10 s). - Check
/metricsand logs for the failing component (storage errors, panics).
node/validator/src/main.rs, not
runtime-configurable): leader timeout 1 s, certification timeout 2 s,
nullify/view-change retry 10 s, peer-fetch timeout 2 s.
Symptom: lagging height (behind the tip)
block_height is well below peers but last_block_timestamp is recent-ish.
- The node is catching up via fast-sync;
watch
block_heightclimb. Syncing nodes get a 10× longer activity timeout, so they are not dropped mid-catch-up. - If height is not climbing, check connectivity to
bootstrappers/ peers and that a peer actually serves/state/snapshot(a peer with no snapshot returns 404).
Symptom: mempool growth / degraded
status: "degraded", mempool_transaction_count near or above 30,000.
- Confirm blocks are still finalizing (
block_heightadvancing). If yes, this is load, not a fault — the backlog drains as blocks include txs. - If height is flat and mempool is growing, the node is stalled — treat as height not advancing above; the backlog is a symptom, not the cause.
Symptom: component unhealthy
/health/detailed components.storage (or rpc) reports non-healthy, or
/health itself fails.
- Pull logs and
/metrics. Storage faults (disk full, QMDB I/O) usually need the node stopped and the disk / state directory inspected. - If state is corrupt, restore from backup or re-fast-sync — see Snapshots & Restore.
Restart safely
In production, restart through your service manager, which stops and starts the binary without touchingdirectory:
directory when
you intend a full resync from genesis or a peer — never as a routine restart
step.
