Лимиты и коды ошибок
Числа ниже — то, что реально проверяется на приёме. Если агент в них не укладывается, он получит отказ на первом же запросе, а не через сорок минут передачи.
#Ограничения передачи
- размер части, минимум
- 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-код, машинный код, человеческое сообщение и, где это осмысленно, детали.
{
"error": {
"code": "E1004",
"reason": "chunk_too_small",
"message": "Часть 3 меньше размера сессии и не является последней",
"details": { "expected": 8388608, "received": 3145728, "lastPart": 5451 }
}
}
Поле reason стабильно и годится для ветвления в коде. Поле message — для человека в логе, его формулировки мы правим без предупреждения.
#Таблица кодов
| Код | HTTP | reason | Что произошло |
|---|---|---|---|
| E1004 | 400 | chunk_too_small | часть меньше размера сессии и не последняя |
| E1007 | 404 | upload_not_found | сессия не существует или уже истекла |
| E1011 | 409 | part_mismatch | часть с этим номером уже принята с другим содержимым |
| E1102 | 409 | region_readonly | регион принимает только чтение |
| E1140 | 507 | quota_exceeded | исчерпана квота пространства |
| E1203 | 410 | cursor_expired | курсор старше срока хранения ленты событий |
| E2003 | 401 | token_expired | срок действия токена истёк |
| E2009 | 401 | token_revoked | токен отозван администратором |
| E2015 | 416 | range_not_satisfiable | запрошенный диапазон вне объекта |
| E2101 | 409 | agent_conflict | второй канал событий на тот же токен |
Пропуски в нумерации — коды, которые существовали в ранних версиях и были убраны. Мы не переиспользуем номера: старый код в чужом логе не должен внезапно означать другое.