Vault защищённое хранилище резервных копий

Лимиты и коды ошибок

Числа ниже — то, что реально проверяется на приёме. Если агент в них не укладывается, он получит отказ на первом же запросе, а не через сорок минут передачи.

#Ограничения передачи

размер части, минимум
5 MiB
размер части, максимум
256 MiB
размер части по умолчанию
8 MiB
частей в объекте
10 000
размер объекта
до 2.4 TiB
длина ключа объекта
512 байт
жизнь сессии
24 ч
параллельных частей
12 на агента
открытых сессий
40 на пространство

Минимум в 5 MiB не действует на последнюю часть — иначе объект в 6 MiB нельзя было бы передать двумя частями. Все остальные части строго равны выбранному размеру: сборка объекта опирается на это при вычислении смещений.

Потолок в 2.4 TiB — следствие двух предыдущих строк (10 000 частей по 256 MiB), а не отдельное решение. Если упираетесь в него, режьте объект на стороне агента.

#Квоты пространства

Квота считается по объёму шифротекста, который вы записали. Внутренние копии в квоту не входят: держать три копии на разных узлах — наша задача, а не ваш расход.

Незавершённые сессии занимают место с момента приёма первой части. Поэтому брошенная сессия на 300 GiB держит квоту сутки, пока не истечёт: если передача не нужна, закройте её явно через DELETE.

При исчерпании квоты открытие новых сессий отклоняется кодом E1140, а уже открытые доводятся до конца. Прервать передачу на середине из-за квоты — худшее, что можно сделать с ночным окном резервного копирования.

#Частота запросов

управляющие вызовы
240 / мин на токен
приём частей
не ограничен
канал событий
1 соединение на агента
заголовок остатка
X-Vault-Rate-Remaining

Ограничение стоит на управляющих вызовах — открытие, завершение, запрос состояния. Сам приём частей не лимитируется по числу запросов: смысла в этом нет, объём и так ограничен квотой и каналом.

При превышении приходит 429 с заголовком Retry-After. Уважайте его: повтор раньше указанного времени продлевает окно.

#Формат ошибки

Все ошибки приходят одинаково: HTTP-код, машинный код, человеческое сообщение и, где это осмысленно, детали.

PUT/v1/chunks/up_5KpR2n8vQz/3400 Bad Request
{
  "error": {
    "code": "E1004",
    "reason": "chunk_too_small",
    "message": "Часть 3 меньше размера сессии и не является последней",
    "details": { "expected": 8388608, "received": 3145728, "lastPart": 5451 }
  }
}

Поле reason стабильно и годится для ветвления в коде. Поле message — для человека в логе, его формулировки мы правим без предупреждения.

#Таблица кодов

Коды ошибок API
КодHTTPreasonЧто произошло
E1004400chunk_too_smallчасть меньше размера сессии и не последняя
E1007404upload_not_foundсессия не существует или уже истекла
E1011409part_mismatchчасть с этим номером уже принята с другим содержимым
E1102409region_readonlyрегион принимает только чтение
E1140507quota_exceededисчерпана квота пространства
E1203410cursor_expiredкурсор старше срока хранения ленты событий
E2003401token_expiredсрок действия токена истёк
E2009401token_revokedтокен отозван администратором
E2015416range_not_satisfiableзапрошенный диапазон вне объекта
E2101409agent_conflictвторой канал событий на тот же токен

Пропуски в нумерации — коды, которые существовали в ранних версиях и были убраны. Мы не переиспользуем номера: старый код в чужом логе не должен внезапно означать другое.