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>
3.5 KiB
3.5 KiB
Итоги: защита от восстановления из пустой копии (находка 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 не запускался: изменение затрагивает только логику восстановления и копирования, проверенную тестом и запуском в контейнере тестового образа.