Files
ripe-cidr-collector/docs/summary-empty-backup-guard.md
T
ayurishchevandClaude Sonnet 5 ab89c87321 Do not trust empty backups when sources are configured
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>
2026-09-21 10:30:03 +03:00

19 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Итоги: защита от восстановления из пустой копии (находка 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 не запускался: изменение затрагивает только логику восстановления и копирования, проверенную тестом и запуском в контейнере тестового образа.