Revision cleanup
Введение¶
Система хранит историю изменений данных параметров в виде ревизий. Каждая ревизия создаёт записи в двух местах:
core_parameter_revision— метаданные ревизии (Django-модельRevision)revision__*— динамические таблицы с данными изменений для каждой меры
Без регулярной очистки эти таблицы растут неограниченно и могут занимать гигабайты дискового пространства.
Механизм очистки¶
Очистка выполняется задачей cleanup_old_revisions_task, которая запускается ежедневно в 03:00 через Celery Beat.
Алгоритм¶
- Вычисляется дата отсечения:
now() - REVISION_RETENTION_DAYS - Для каждой меры с поддержкой ревизий выполняется raw SQL:
DELETE FROM revision__<measure_key> WHERE revision_id IN ( SELECT id FROM core_parameter_revision WHERE created_at < cutoff ) - Если таблица
revision__*не найдена в базе — регистрируется предупреждение в логе, выполнение продолжается - Удаляются устаревшие записи
Revisionчерез ORM:Revision.objects.filter(created_at__lt=cutoff).delete() - 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__*таблиц