fix: разовый VACUUM — после разряжения и по состоянию файла
incremental_vacuum отдаёт по одной странице за вызов (замерено: 50 вызовов —
50 страниц, 200 КБ), так что распухший файл он не сжимает, а разовый VACUUM
срабатывал при старте ДО первого прохода разряжения — когда удалять ещё
нечего, — и на следующем старте уже не запускался: режим auto_vacuum к тому
моменту включён. Теперь первый проход разряжения делает lifespan, VACUUM идёт
после него, а признак — состояние самого файла: режим не включён либо
свободные страницы занимают больше четверти. Ошибка прохода откатывает
транзакцию и не мешает старту панели; нехватка места под VACUUM — тоже не
ошибка старта, только запись причины в лог.

Замер на синтетике «как прод» (14 суток, интервал 30 с, ~6.4 КБ JSON на точку,
330.7 МБ, auto_vacuum=0): старт удаляет 33 247 строк, схлопывает 4 202 бакета и
сжимает файл 332.9 → 58.5 МБ; повторный старт не делает ничего.
1 parent 98d3bbb commit ace50596716f98b27d91e1c8a83885c5eb55cff6
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 4 hours ago
Showing 3 changed files
View
panel/backend/app/db.py
View
panel/backend/app/main.py
View
panel/backend/app/metrics_retention.py