fix(state): do not stamp empty FTS after interrupted optimize-storage demote
Demote wrote the empty v23 schema via executescript inside BEGIN IMMEDIATE, which commits early and can leave trash + empty indexes without rebuild markers. Re-run then tore down trash and stamped fts_storage_version with docsize=0, permanently losing historical session search. Stage markers with the demote, create schema only after they are durable, heal empty-index bookkeeping on resume, and refuse settle until the base index is populated. Settle refusal returns ok=False instead of raising, and resume fails fast if the base v23 table cannot be re-created. Orphan-marker repair only resets a missing fts_rebuild_progress to 0 once the index is known empty: the chunk worker replays its whole selected id range without an anti-join, so a partially indexed DB that lost only its progress key is first reset to a known-empty surface, then rebuilt. Ported onto the SessionDB mixin split (hermes_state_search.py / hermes_state_schema.py).
This commit is contained in:
@@ -730,7 +730,8 @@ class SessionSchemaMixin:
|
||||
# FTS_STORAGE_VERSION; a legacy DB is left at whatever it had
|
||||
# (absent/0) until `optimize-storage` runs. An INTERRUPTED
|
||||
# optimize (legacy vtables already demoted, but rebuild markers
|
||||
# or demoted trash tables still present) is NOT stamped either —
|
||||
# or demoted trash tables still present, or an empty external
|
||||
# index against non-empty messages) is NOT stamped either —
|
||||
# the marker is the source of truth for "fully optimized", and
|
||||
# `fts_optimize_available()` keeps offering the resume until the
|
||||
# transition actually completes.
|
||||
@@ -742,6 +743,7 @@ class SessionSchemaMixin:
|
||||
"WHERE key = 'fts_rebuild_high_water' LIMIT 1"
|
||||
).fetchone() is None
|
||||
and not self._has_fts_trash(cursor)
|
||||
and not self._fts_external_index_empty_with_messages(cursor)
|
||||
):
|
||||
self.set_meta(
|
||||
"fts_storage_version", str(FTS_STORAGE_VERSION), cursor=cursor
|
||||
|
||||
Reference in New Issue
Block a user