Restoring a backup with no data while sources are configured now sets the db_recreated.json marker (503 until data is collected), and the backup job skips copying an empty database in that state. Adds finding 11 to the review. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
19 lines
3.5 KiB
Markdown
19 lines
3.5 KiB
Markdown
# Итоги: защита от восстановления из пустой копии (находка 11)
|
||
|
||
План: `docs/plan-empty-backup-guard.md`. Находка добавлена в `docs/review-2026-09-21.md` после трассировки `_recover()` по графу знаний.
|
||
|
||
## Сделано
|
||
- **Восстановление (`db._recover`):** копия, в которой нет ни одного адреса, при настроенных источниках (`config.json` с ASN или FQDN, нечитаемый конфиг тоже считается «настроены») восстанавливается вместе с меткой `db_recreated.json` (поле `reason`). Метка ставится до подмены файла базы, чтобы другой процесс не успел открыть пустую базу без метки. Дальше действует прежняя защита: `503` с `Retry-After` на `/addresses` и `/addresses/diff`, `degraded` и `db_recreated` в `/health`, сборщик снимает метку после появления данных. Копия с данными метку не ставит.
|
||
- **Задание `backup` (`db.backup_database`, `run_backup`):** пустая база при настроенных источниках не копируется (`None`, предупреждение в логе, статус задания успешный, ротация не выполняется). Пустые копии не вытесняют хорошие при ротации и не появляются вовсе; без источников копия делается как раньше.
|
||
- **Общие функции:** `_mark_recreated` (метка для обеих веток восстановления), `_sources_configured`, `empty_despite_sources`, `_backup_is_empty`.
|
||
- **README, отчёт ревью** (находка 11 исправлена).
|
||
- **Тесты:** 1 новый (пустая база не копируется при источниках; пустая копия при появлении источников даёт метку; копия с данными восстанавливается без метки). Всего 28, в контейнере 28 passed.
|
||
|
||
## Проверка
|
||
Повтор запуска, воспроизводившего проблему (контейнерное окружение): пустая копия -> порча -> `/addresses` теперь `503` (`Retry-After: 300`), `/addresses/diff` `503`, `/health` `db_recreated: {pending: true}`; после появления данных `200` с адресами и метка снята. Задание `backup` при настроенном источнике и пустой базе пропущено (копий было 1, стало 1).
|
||
|
||
## Замечания
|
||
- Критерий «пусто» общий, а не по типам: копия с ASN, но без адресов FQDN (например, все отфильтрованы как неглобальные), метку не ставит и не блокирует выдачу.
|
||
- Уже существующие пустые копии не удаляются: при необходимости - вручную из `backups/`.
|
||
- Docker Compose не запускался: изменение затрагивает только логику восстановления и копирования, проверенную тестом и запуском в контейнере тестового образа.
|