Files
healthlog/docs/backlog/celostnost-pered-podmenoj.md
T
av ebd59af056 беклог: две задачи из разбора reindex
- целостность собранной витрины проверяется отпечатком на открытом
  дескрипторе — перед необратимой подменой нужен integrity_check
- пересборка материализует учёт и список путей архива целиком: расход
  памяти растёт вместе с журналом
2026-08-02 09:11:53 +03:00

28 lines
2.2 KiB
Markdown

# Проверка целостности собранной витрины перед подменой
**Приоритет:** средний
`healthlog reindex` собирает витрину в отдельный файл и снимает с него
отпечаток, а подмену делает человек: остановить сервис, переименовать файл,
поднять обратно. Это **единственный необратимый шаг** всей операции — и
единственный, перед которым мы ничего не проверяем.
Отпечаток сегодня снимается на **ещё открытом дескрипторе**: он говорит, что
свёртка сошлась, но не говорит, что файл на диске корректен как база SQLite.
Между «свёртка сошлась» и «файл цел» помещается всё, о чём предупреждает
[How To Corrupt An SQLite Database](https://www.sqlite.org/howtocorrupt.html):
оборванный `fsync`, полный диск, ФС, соврала о записи. Человек в этот момент
уже удалил рабочую витрину.
Что делать: после закрытия файла и **до** того, как команда объявит результат
годным к подмене, открыть его заново и прогнать `PRAGMA integrity_check`.
Не прошёл — команда завершается отказом и прямо говорит, что подменять нечем.
Дёшево: одна страница кода, один прогон по готовому файлу. Ценно ровно в тот
момент, когда всё остальное уже пошло не так.
Готово, когда `reindex` на заведомо испорченном выходном файле отказывается
называть результат годным, а на здоровом — не замедляется заметно.
Связано: `cmd/healthlog/reindex.go`, `docs/architecture.md` → «Пересборка».