Galleon хранит данные в два слоя: метаданные (каталог артефактов, пользователи, настройки) — в PostgreSQL, содержимое артефактов — файлами на диске в каталоге хранилища (storage.default.local.root).

Устройство каталога хранилища

Корень хранилища содержит:

  • blobs/ — содержимое пакетных форматов. Файл именуется хешем SHA-256 своего содержимого, поэтому одинаковые данные хранятся в одном экземпляре, сколько бы репозиториев и путей на них ни ссылалось.
  • docker/ — манифесты и слои образов контейнеров, со своей раскладкой. Слои тоже адресуются по контрольной сумме и разделяются между образами; учёт ведётся в отдельных таблицах той же базы данных.
  • galleon-storage.json — маркер привязки каталога к базе данных. Сервер создаёт его при первом запуске; копируйте его вместе с каталогом.

На чужом или непримонтированном каталоге сервер не стартует: сообщение об ошибке начинается с storage identity: и указывает на причину.

Запись об ассете хранится только в базе данных и указывает на файл в хранилище. На один и тот же файл может ссылаться сколько угодно ассетов из разных репозиториев, поэтому удаление ассета освобождает место только тогда, когда исчезает последняя ссылка на файл. Модель компонентов и ассетов описана в разделе Репозитории и форматы.

Внезапное отключение питания не оставляет наполовину записанных файлов, на которые уже ссылается база данных.

Сборка мусора

Сборка мусора не решает, что устарело: она забирает содержимое, на которое не осталось ссылок. Решение о том, какие компоненты удалить, принимают администратор вручную или политики очистки (Политики очистки).

Артефакт, удалённый из каталога артефактов, не удаляется с диска немедленно: файлы, на которые больше нет ссылок, находит и удаляет фоновая сборка мусора. Она обслуживает оба дерева хранилища одним циклом по одному расписанию. Останавливать загрузки на время цикла не нужно.

Параметры — блок gc конфигурации:

КлючПо умолчаниюНазначение
autotrueПлановые циклы; false отключает только расписание — ручной запуск работает всегда
interval5mПауза между плановыми циклами
grace_period24hМинимальный возраст удалённого содержимого, после которого его место освобождается
batch_size500Кандидатов за один запрос сканирования
max_duration15mПотолок длительности одного цикла; остаток доберёт следующий

Из-за grace-периода место освобождается не сразу: удалённое содержимое остаётся на диске не меньше grace_period. Это же значение действует и для образов контейнеров.

Наблюдение и ручной запуск

Страница «Настройки» → «Сборка мусора» показывает состояние сборки: идёт ли цикл прямо сейчас, когда был предыдущий («Последний запуск»), чем он закончился («Последний результат» — сводка вида «OK: N objects reclaimed») и когда ожидается следующий.

Кнопка «Запустить» запускает цикл немедленно. Запуск асинхронный: интерфейс подтверждает, что цикл начат, а сам он продолжается в фоне — закрытая страница его не прерывает. Одновременно выполняется только один цикл, повторный запуск отклоняется.

Просмотр страницы требует привилегии nx-tasks-read, запуск — nx-tasks-run.

Параметры сборки мусора со страницы не меняются — только в конфигурации сервера, с перезапуском.

Пауза на время обслуживания

Кнопка «Приостановить» на той же странице останавливает и плановые циклы, и ручной запуск. Пауза действует ограниченное время: по умолчанию сутки, максимум семь дней. По истечении срока она снимается автоматически, поэтому забытая пауза не остановит освобождение места навсегда. Кнопка «Возобновить» снимает её досрочно. Состояние переживает перезапуск сервера; если серверов несколько, оно общее для всех.

Пауза нужна прежде всего для резервного копирования — подробнее в разделе Резервное копирование. На удаление артефактов пользователями она не влияет: удалить компонент или репозиторий можно и во время паузы, место освободится позже.

Если место закончилось

Переполнение диска проявляется ошибками при загрузке артефактов; в логе сервера у таких записей в поле err видно no space left on device. Чтение при этом продолжает работать.

Чтобы освободить место, выполните следующие действия:

  1. Удалите ненужные артефакты в разделе «Обзор» веб-интерфейса — в первую очередь крупные и устаревшие сборки.
  2. Запустите сборку мусора кнопкой «Запустить» на странице «Настройки» → «Сборка мусора».
  3. Если освободилось недостаточно, уменьшите grace_period в конфигурации и перезапустите сервер: файлы моложе grace-периода сборка мусора не трогает.

Не удаляйте файлы из каталога хранилища вручную. Имя файла — хеш его содержимого, поэтому по имени нельзя понять, на какой артефакт он ссылается; удалённый по ошибке файл не восстанавливается и не обнаруживается сборкой мусора, а обращения к соответствующему артефакту начнут завершаться ошибкой.