Перейти к содержанию

Revision cleanup

Введение

Система хранит историю изменений данных параметров в виде ревизий. Каждая ревизия создаёт записи в двух местах:

  • core_parameter_revision — метаданные ревизии (Django-модель Revision)
  • revision__* — динамические таблицы с данными изменений для каждой меры

Без регулярной очистки эти таблицы растут неограниченно и могут занимать гигабайты дискового пространства.

Механизм очистки

Очистка выполняется задачей cleanup_old_revisions_task, которая запускается ежедневно в 03:00 через Celery Beat.

Алгоритм

  1. Вычисляется дата отсечения: now() - REVISION_RETENTION_DAYS
  2. Для каждой меры с поддержкой ревизий выполняется raw SQL:
    DELETE FROM revision__<measure_key>
    WHERE revision_id IN (
        SELECT id FROM core_parameter_revision WHERE created_at < cutoff
    )
    
  3. Если таблица revision__* не найдена в базе — регистрируется предупреждение в логе, выполнение продолжается
  4. Удаляются устаревшие записи Revision через ORM: Revision.objects.filter(created_at__lt=cutoff).delete()
  5. CASCADE автоматически удаляет связанные записи из core_parameter_revision_measure, core_revision_corrections и других зависимых таблиц

Настройка

Срок хранения определяется переменной окружения:

REVISION_RETENTION_DAYS=14
  • По умолчанию: 14 дней
  • Где задаётся: .env или переменная окружения
  • Где читается: /src/planiqum/core/settings_envs.py

Использование из Python

Функцию очистки можно вызвать напрямую из кода:

from planiqum.core.parameters.tasks import cleanup_old_revisions

# С настройкой из переменной окружения
result = cleanup_old_revisions()

# С явным указанием срока (30 дней)
result = cleanup_old_revisions(retention_days=30)

Результат — словарь:

{
    "revision_tables": {
        "revision__measure_key_1": 1500,  # удалённых строк
        "revision__measure_key_2": 0,
    },
    "revisions_deleted": 42,  # удалённых записей Revision
}

Логирование

Задача записывает в лог:

  • Дату отсечения и количество устаревших ревизий
  • Количество удалённых строк из каждой revision__* таблицы
  • Предупреждения о ненайденных таблицах
  • Итог: общее количество удалённых записей Revision
  • Ошибки выполнения

Связанные механизмы

  • Очистка результатов Celery — аналогичный механизм для django_celery_results_taskresult
  • clear_import_log_parameter — удаление Import-записей старше 14 дней (файлы + метаданные импорта, запускается в 02:00)
  • Revision.delete() — при ручном удалении ревизии также очищает данные из revision__* таблиц