Всегда ли нужно проверять isTruncated в ответах S3 ListObjects / ListObjectsV2? - PullRequest
1 голос
/ 20 мая 2019
Ответы

S3 ListObjects и ListObjectsV2 API содержат элемент ответа IsTruncated, который (в соответствии с V1 API документами )

Указывает, (true) или нет (false) все результаты были возвращены.Если число результатов превышает указанное в MaxKeys, все результаты могут быть не возвращены.

Согласно разделу Список объектов документации S3:

Поскольку корзины могут содержать практически неограниченное количество ключей, полные результаты запроса списка могут быть чрезвычайно большими.Для управления большими наборами результатов API-интерфейс Amazon S3 поддерживает разбиение на страницы, разделяя их на несколько ответов.Каждый ответ на список ключей возвращает страницу, содержащую до 1000 ключей, с индикатором, указывающим, урезан ли ответ.Вы отправляете серию запросов списка ключей, пока не получите все ключи.Библиотеки-оболочки AWS SDK обеспечивают одинаковую нумерацию страниц.

Очевидно, что нам нужно проверить isTruncated, если существует вероятность того, что список может соответствовать более 1000 ключей.Точно так же, если мы явно установим MaxKeys, тогда нам определенно необходимо проверить isTruncated, есть ли вероятность того, что листинг может соответствовать более чем MaxKeys ключам.

Однако нужно ли проверять isTruncated если мы никогда не ожидаем, что будет больше чем min(1000, MaxKeys) соответствующих ключей?

Я думаю, что самая слабая возможная интерпретация документации по API S3 состоит в том, что S3 вернет самое большее min(1000, MaxKeys)количество ключей на вызов списка, но технически может вернуть меньше ключей , даже если существует больше подходящих ключей и будет соответствовать в ответе .Например, если имеется 10 совпадающих ключей и MaxKeys == 1000, то для S3 было бы технически правильно вернуть, скажем, 3 ключа в первом ответе API и 7 во втором.(Технически я полагаю, что он мог бы даже вернуть ноль ключей и установить isTruncated = true, но такое поведение кажется маловероятным).

При такой слабой семантике я думаю, что всегда нужночтобы проверить isTruncated, даже если мы перечисляем то, что мы ожидаем от очень небольшого количества ключей.Как следствие, любой код, который не проверяет isTruncated, является (скорее всего) ошибочным.

В прошлом я наблюдал этот семантический список из других API-интерфейсов AWS (включаяAPI рынка зарезервированных экземпляров EC2).

Это правильная интерпретация семантики API S3? Или S3 фактически гарантирует (но не документирует) более сильную семантику (например, «если больше, чем *»)Ключи 1058 * соответствуют списку, тогда список будет содержать ровно MaxKeys)?

Меня особенно интересуют ответы, которые ссылаются на официальные источники AWS (такие как ответы на форуме AWS, проблемы SDK и т. Д.).

1 Ответ

0 голосов
/ 21 мая 2019

По моему опыту, он всегда будет возвращать максимальное количество значений, которое соответствует вашему состоянию: min(1000, MaxKeys)

Так что, если вы знаете, что у вас всегда будет менее 1000 результатов, вам не нужно будетcheck isTruncated.

Имейте в виду, довольно просто построить цикл while для этого.(Возможно, проще, чем написать этот вопрос!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...