Files
ds-galo/openspec/changes/storage-orphan-reconciliation/proposal.md
T
iu 176a8d8ced feat(metadata): SQLite backend, storage reconciliation and local defaults
- pluggable per-domain Repository interfaces; PostgreSQL and SQLite impls
- SQLite on modernc.org/sqlite (WAL, busy_timeout, foreign_keys, immediate tx)
- separate migrations/sqlite and db.MigrateSQLite; store.NewPostgres/NewSQLite
- cmd/reconcile compares object storage with the journal (report, then --delete)
- storage.Backend.List and photos.Repository.AllStorageKeys
- DB_BACKEND/SQLITE_PATH and STORAGE_BACKEND/FS_ROOT selectable; local defaults
  (sqlite ./galo.db, fs ./data)
- Makefile reconcile/reconcile-delete; docs and .env.example updated
2026-10-11 10:08:31 +03:00

2.4 KiB

Proposal

Why

Сборка мусора воркера управляется журналом objects и никогда не сканирует хранилище. Поэтому блобы, у которых нет строки в журнале (после сброса БД в обход журнала, исторических миграций или ошибок), накапливаются и не удаляются никогда: воркер их не видит. Нужна ручная сверка «хранилище ∖ журнал».

What Changes

  • Добавить в storage.Backend перечисление объектов под префиксом (ключ, размер, время изменения); реализовать для S3 (ListObjectsV2) и локальной ФС (обход каталога).
  • Добавить в слой метаданных чтение всех ключей журнала objects (Postgres и SQLite).
  • Добавить maintenance-команду cmd/reconcile: по умолчанию — только отчёт (сироты и пропавшие), флаг --delete удаляет сироты с учётом минимального возраста (--min-age), область ограничена префиксом objects/.
  • Пропавшие ключи (есть в журнале, нет в хранилище) только сообщаются — автоматически не «исправляются».

Capabilities

New Capabilities

  • storage-reconciliation: ручная сверка объектного хранилища с журналом метаданных и удаление осиротевших блобов.

Modified Capabilities

Impact

  • backend/internal/storage (интерфейс + перечисление для S3 и ФС).
  • backend/internal/photos (Repository.AllStorageKeys, реализации pg и sqlite).
  • Новый backend/cmd/reconcile.
  • README.md, project.md.
  • Не меняет API и существующие спеки; дополняет media-objects ручной сверкой к журнальной сборке мусора.