Commit graph

2 commits

Author SHA1 Message Date
trvon
a57889e783
fix(metadata): summarize snapshots from membership
getSnapshots, getSnapshotInfo and batchGetSnapshotInfo read only each
document's latest snapshot_id key, so a re-stored document disappeared
from every earlier snapshot's file count, and a snapshot whose documents
were all re-stored vanished from the list.

- getSnapshots lists tree_snapshots, document_snapshots and latest keys.
  It deliberately skips legacy snapshot_id:<id> keys, which would be a
  full-table scan on large corpora until the backfill finishes.
- batchGetSnapshotInfo counts members from document_snapshots, legacy
  keys not yet moved, and latest keys, each looked up by id through an
  index; label and git commit come from tree_snapshots first.
- getSnapshotInfo delegates to the batch query, removing three
  near-duplicate queries.

Signed-off-by: trvon <me@trevon.dev>
2026-09-27 08:21:50 -06:00
trvon
3637567512
fix(metadata): record snapshot membership in its own table
Every store added two metadata rows per snapshot to the document,
snapshot_id:<id> and snapshot_time:<id>, and nothing removed them.
Content-addressed documents are shared across paths and passes, so they
piled up: on one 93 GB database they were 43.1M of 44.0M metadata rows,
one file carried 52,367 snapshots, and 'yams list' timed out hydrating
2.69M rows for its 100 documents. Meanwhile findDocumentsBySnapshot read
only the latest snapshot_id, so a re-stored document dropped out of every
earlier snapshot.

- Migration 42 creates document_snapshots(document_id, snapshot_id,
  snapshot_time), keyed on (document_id, snapshot_id). It only creates the
  table, so startup stays fast.
- The insert transaction records membership; stores keep only the latest
  snapshot_id/snapshot_time keys.
- findDocumentsBySnapshot and file history read membership, falling back
  to legacy keys through one shared parser (legacySnapshotEntries).
- getMetadataForDocuments skips legacy keys via idx_metadata_doc_key: on
  the 93 GB database, 0.21 s instead of 18.5 s for list's 100 documents.
- RepairService moves legacy keys in the background, 1000 snapshots per
  batch, 200 ms apart, only below Warning pressure.

Signed-off-by: trvon <me@trevon.dev>
2026-09-26 13:20:18 -06:00