Status

Last updated 29 October 2026

View .md

Every field of the object db.status() returns, UrsulaStatus, and what each means.

status() of an UrsulaDatabase is synchronous and reads only local state. Its fields are snake_case, the same JSON the extension’s ursula_status returns to every host. What to do about a value is on Troubleshooting.

status(): UrsulaStatus

UrsulaStatus

FieldTypeWhat it means
namestringThe stream’s path, such as /acme/notes.
pathstringThe local database file the extension bound.
statestringlive; provisional while an open that found the stream unreachable serves the trusted cache with its claim deferred (see open()); retiring once its last connection closed and replication drains; retired; or reset.
rolestringowner, or reader for a readOnly open’s own reader cache, which claims nothing. A read-only connection on the binding its process owns reports the owner’s status.
closedbooleanWhether the stream was closed when the open read it. Only a reader opens a closed stream.
epochnumber | nullThe epoch this owner claimed, null before its claim is acknowledged and for a reader.
cluster_idstringThe id of the Ursula deployment that holds the stream.
incarnationstringThe stream's incarnation, which changes when the stream's history changes, such as a restore or a recreate.
lineagestringThe local cache's lineage: a cache built anew has a new one.
commits.loggednumberThe position of the last commit logged locally.
commits.confirmednumberThe position of the last commit SQLite published.
commits.acknowledgednumberEvery commit up to this position is in the stream.
commits.pendingnumberHow many logged commits the stream has not acknowledged yet.
commits.pending_bytesnumberTheir compressed size, which writes may not take past maxPendingBytes.
replication.statestringactivating while the claim goes out, streaming once it applied, reset, refused (the claim lost to racing claimants), stopped, or none for a reader.
replication.conditionstring | nullWhy requests wait, or null. See Conditions.
attach.localstringWhere the open got the local database: resumed (a trusted local cache), rekeyed (a trusted cache kept across a history change that inherits it), built (from the stream), salvaged (built after moving the cache into salvage/), or caught_up (a reader cache read to the stream’s tail).
attach.snapshot_offsetnumber | nullFor built and salvaged: the snapshot it built from, or null from the stream’s start.
snapshot.offsetnumber | nullThe stream offset of the latest snapshot this binding published, null before its first. A new cache builds from a snapshot and the log after it (see When the program moves).
snapshot.age_msnumber | nullHow long ago it published that snapshot, null before its first.
snapshot.failuresnumberFailed attempts since the last that published.
snapshot.errorstring | nullWhy the latest attempt failed, or why snapshots stopped for good; null when neither.
snapshot.log_bytesnumberFrame bytes acknowledged since the latest snapshot.
snapshot.due_bytesnumberThe log_bytes past which a snapshot is due.
refusedobject | nullThe last write refused with nothing committed: kind, action, class, which is write_refused (since 0.11.2), and message (see UrsulaWriteRefusedError).
salvageUrsulaSalvage[]Local caches of this stream moved aside, oldest first. See UrsulaSalvage.
resetobject | nullnull until the database is reset, then its kind, action, and since 0.11.2 its class, which is reset, and the message that says what happened and what to do (see UrsulaResetError).

Conditions

replication.condition says why requests to the stream wait. Commits continue locally meanwhile, until maxPendingBytes is reached. retrying is a request that got no definite answer and goes again after a backoff; every other condition blocks, and the request goes again every 30 seconds until the cause is gone.

ConditionWhat it means
retryingNo definite answer, such as a network failure.
unauthorizedThe stream answered 401: the token is missing, expired or revoked.
payment_requiredThe stream answered 402 (see When the balance runs out).
forbiddenThe stream answered 403, such as for an account whose access was revoked.
request_too_largeA request was refused as too large (see URSULA_VFS_MAX_REQUEST_BYTES).
redirectedThe stream answered with a redirect, which is never followed.
wrong_clusterThe server is another deployment than the one the cache was built on.
no_server_identityAn answer without Ursula-Protocol and Ursula-Cluster-Id, such as a proxy’s.
protocol_mismatchA server of another release line.
rejectedAnother status the extension does not retry.

UrsulaSalvage

An entry of salvage: a local cache moved aside, never read or deleted by the extension. Its dir holds a plain SQLite database db, its log and a manifest.json (see Salvage).

FieldTypeWhat it means
dirstringWhere it was moved.
reasonstringhistory_changed (a history change of the stream that does not keep it), replaced (a db file that was not the cache’s own), or recreated (the stream created again over it with recreate).
timestringWhen it was moved aside, RFC 3339 in UTC.
incarnationstring | nullThe stream incarnation the cache was built under, null for a replaced one.
stream_incarnationstring | nullThe stream's incarnation when it was moved aside.
acknowledged_positionnumber | nullEvery commit up to here was in the stream under incarnation; null for a replaced one.
unacknowledgednumber | nullHow many of its commits came after that, which the stream may never have held.
plainbooleanWhether db opens as a plain SQLite database.