4.2.1.2.1.3.4. Очистка

Очистка базы данных осуществляется по следующим условиям:
 
Настройки предельного размера и глубины хранения находятся в разделе data/storage_limits.
Также в разделе data/cleanup содержатся настройки сокращения объёма базы данных, а также флаг разрешения команды очистки.
 
Независимо от события, по которому очистка была инициирована, она выполняется следующим образом:
Выполняется по временным секциям: если для временной секции выполняется условие очистки, то удаляется всё её текущее содержимое
Учитываются блокировки удаления регионов данных: если для секции выполняется условие очистки, но она попадает в интервал, защищённый от удаления, то она не удаляется
Удаление содержимого временной секции затрагивает только файловые фрагменты данных. Данные, ещё находящиеся в тракте сохранения (в журнале транзакций, в накапливаемых или уже подготовленных к сохранению InMem-фрагментах), не удаляются. Если имеются ещё не сохранённые в файловые фрагменты данные, для которых выполняется условие очистки, они будут удалены позже - после того, как будут сохранены на диск.
 
Удаление содержимого секции выполняется в два этапа:
Логическое удаление - секция помечается как удалённая. После этого удалённое содержимое секции становится недоступным для операций чтения. При этом операции чтения, которые на момент удаления уже находились на позиции секции,  продолжат читать её содержимое, поскольку удерживают временную блокировку секции (устанавливается на время чтения)
Физическое удаление - когда с содержимого секции будут сняты все блокировки со стороны операций чтения.

Логический и физический объём данных

 
Логический объём данных - совокупный объём файловых фрагментов во всех временных секциях, которые не были помечены как удалённые.
Этот объём публикуется в параметре StorageMetrics/DataSize интерфейса мониторинга.
 
В физический объём данных - совокупный всех существующих объём файловых фрагментов, включая те, что принадлежат уже удалённым временным секциям, но пока удерживаются текущими операциями.
При планировании и выполнении очистки по объёму всегда используется логический объём.

Уведомления об операциях очистки

 
Событие CleanupEvent в разделе StorageMetrics интерфейса мониторинга используется для рассылки уведомлений о выполненных операциях очистки базы данных: для каждой временной секции, очистка которой была выполнена, отправляется строка
Секция [<start>, <end>) удалена. Причина: <reason>.
Здесь:
<start> - нижняя граница времени для секции
<end> - верхняя граница времени для секции
<reason> - описание причины выполнения операции очистки:
истечение срока хранения (очистка по глубине)
превышение предельного объёма
в случае очистки по команде - текст, указанный в параметре reason команды очистки JSON API
 
Уведомления отправляются в рамках выполнения очередного цикла обновления данных мониторинга, соответственно, с небольшим запаздыванием относительно фактического времени завершения операций очистки (период обновления - ~2 с).