Files
ripe-cidr-collector/docs/summary-empty-backup-guard.md
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

3.5 KiB
Raw Permalink Blame History

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