Each runbook is a procedure. Read the whole procedure before you start it.
Use this before maintenance on the active member.
Ctrl-C, or with SIGINT. It releases its
leases on the way out.standby took over write lease. Takeover
happens within one third of the lease time-to-live.--owner and --ha. It rejoins as
standby.If the supervisor sends SIGTERM, the process dies without releasing the
lease. Takeover then costs one full lease time-to-live.
Nothing is required for service. The standby takes over within the time-to-live plus one third.
corium db stats, and
read the lease owner in the Metrics panel of corium tui.--ha. It rejoins
as standby.Both members print ownership messages in their logs.
This is not possible for durable state. The root record is owned by exactly one lease version, and every publish and acknowledgement is fenced by it.
deposed is the loser. It stands down on its own.corium tui reads the lease
owner from the Status call.--ha it waits up to
--lease-wait-ms. With --ha it waits without limit.corium restore <file> --data-dir <empty-dir> --as-db <name>.:index-lag in corium db stats reaches zero.Read the error first. Four causes are common.
| Error names | Cause | Fix |
|---|---|---|
| A lease holder | Another transactor holds the lease. | Add --ha to stand by, or stop the other member. |
| A storage key | The process cannot resolve a named KEK. | Give it a --storage-key that resolves. |
| A Cargo feature | The binary lacks the storage or OIDC feature. | Rebuild with the feature. |
| A missing data directory | --data-dir is absent. | Pass it, or set :data-dir in the configuration file. |
The process fails at startup for a key it cannot resolve. That is by design. It does not fail later at the first read.
FAILED_PRECONDITIONTwo causes give this status.
A standby. The message names the current lease holder. Point the client at that endpoint, or pass the whole endpoint list.
A fenced key. Run corium keys status <db>. If :keys-fenced is true,
the manifest opened an epoch that this node cannot load.
--storage-key that resolves the KEK that the
manifest names.:keys-fenced is false.See encryption at rest.
The result of a transact call whose connection died mid-request is unknown.
The transaction is committed, or it is absent.
sync on the connection.Writes continue throughout. Only a blocked change stops the procedure.
corium schema update <db> --schema <file>. Nothing is written.:attributes in corium db stats with the expected count.A plan is invalidated by a schema change or a failed condition, never by ordinary data writes. Re-plan if the digest is refused.
See schema management.
Read the reason that the plan prints under the change.
| Reason | Meaning | Fix |
|---|---|---|
value-type-mutation | A value type cannot change in place. | Follow the replacement-attribute recipe that the plan prints. |
unique-duplicates | Duplicate values exist. | Retract the duplicates, then plan again. |
cardinality-conflicts | An entity holds several values where the file asks for one. | Choose a winner per entity and retract the rest. |
ever-protected | The attribute has been protected at some time. | It can never gain index or unique. Drop them from the file. |
protection-conflict | The declaration combines protection with index, unique, or ref. | Drop the conflicting property from the declaration. |
An apply can also fail after a clean plan.
| Error code | Meaning | Fix |
|---|---|---|
plan-mismatch | The schema changed between the plan and the apply. | Plan again and read the new plan. |
allow-required | A change needs --allow <class>. | Add the exact allowance the plan names. |
ack-required | A change needs --ack <code>. | Add the exact code the plan names. |
The policy denies, or the policy is unreadable.
corium authz status. A missing basis means the policy is unreadable.--authz-db.corium authz grant. Test each one with
corium authz check.--authz-db.:index-lag in corium db stats, and the publication duration in the
metrics endpoint.--index-backoff, so publication takes a larger share of wall-clock
time.--index-tail-threshold if a large threshold defers the work.Index lag never risks durability. It lengthens cold-peer bootstrap and it makes a backup less fresh.
A peer holds every datom that it has seen, including retractions.
--peer-bootstrap, so it starts from the published
snapshot rather than replaying the log from basis 0.See indexes and storage.
corium backup refuses an encrypted database.
corium gc --transactor <url> --window 72h.corium_transactor_gc_retained_blobs_total. A large retained count means
that the window is holding the blobs.--gc-window only when no reader holds a root older than the new
window.corium db delete.The log is the source of truth. A data directory with an intact log recovers by replay.
corium db stats with the last known values.Never edit or delete files under <data-dir>/logs by hand. Old lease-version
files are inert history that readers must merge.
Can you improve this documentation? These fine people already did:
Claude & Casey MarshallEdit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |