Recover an interrupted environment

The symptom

A command or a connect call fails with a recovery error:

$ ontoenv status
Error: OntoEnv recovery required: interrupted mutation marker at
./.ontoenv/catalog.pending; run `ontoenv recover` or call OntoEnv::recover
to rebuild the catalog

In Python this surfaces as ontoenv.CatalogRecoveryError.

This means a process was killed between writing a graph and publishing the updated index. The graphs are fine; the index may not describe all of them. OntoEnv refuses to trust it rather than serving you a stale view.

The fix

$ ontoenv recover
Recovered catalog at ./.ontoenv with 12 ontology records.
from ontoenv import OntoEnv, CatalogRecoveryError

try:
    env = OntoEnv.connect("./ontology-env")
except CatalogRecoveryError:
    env = OntoEnv.recover("./ontology-env")

With a custom graph store, pass it:

env = OntoEnv.recover("./ontology-env", graph_store=store)

Recovery scans every stored graph and publishes a replacement index. It is much slower than a normal open, so it is not something OntoEnv does for you automatically.

ontoenv recover uses the same environment discovery as every other command: it walks up from the current directory and honours ONTOENV_DIR.

Warning

Do not delete .ontoenv/catalog.pending by hand. The marker is what tells OntoEnv the index is untrustworthy; removing it makes a possibly incomplete index look valid. recover removes it only after the replacement index is successfully published.

If recovery fails

Recovery requires a stable, fully readable snapshot of the backend. It aborts and leaves the marker in place if a graph cannot be read or the backend changes mid-scan — so the operation is always safe to retry.

Stop anything else writing to the environment, then run it again.

When this is not the problem

A missing owl:imports target does not leave a recovery marker. In non-strict mode, import_dependencies(..., fetch_missing=True) and get_dependencies(..., fetch_missing=True) are best-effort: they skip what they cannot reach and commit the partial result cleanly.

So a recovery marker always means an interrupted or failed commit, never merely an unresolved import. For missing imports, see Diagnose import problems.

Recovery is unavailable for temporary environments (--temporary / OntoEnv(temporary=True)), which have nothing persisted to recover from.

Start over instead

If you would rather rebuild from your source files than recover:

$ ontoenv reset
$ ontoenv init ./ontologies

reset deletes .ontoenv/ entirely, including cached remote ontologies, which will be re-downloaded.