ECS. Проверка существования объекта S3
Summary: Как проверить существование объекта в s3.
Instructions
Использование HEAD для более эффективной проверки существования объекта.
Перечисление объектов по своей сути является неэффективным способом проверки существования конкретного объекта. Поиск по индексу не только относительно медленный для этого конкретного запроса, но и может повлиять на общую нагрузку и производительность.
Запрос конкретного объекта всегда более эффективен, чем запрос одного или нескольких объектов, соответствующих параметрам. Перечисление объектов — это форма поиска, при которой необходимо запрашивать распределенные индексы.
Использование HEAD на объекте является лучшим методом проверки его существования. В объектном SDK ECS это делается с помощью GetObjectMetadataRequest.
Если объект НЕ существует, пакет SDK создает следующее исключение из-за ответа об ошибке 404:
Exception in thread "main" com.emc.object.s3.S3Exception: Not Found
Ниже приведен пример использования GetObjectMetadataRequest, который используется в клиентском методе getObjectMetadata:
try { GetObjectMetadataRequest gom = new GetObjectMetadataRequest(<bucket>, <key>); S3ObjectMetadata om = s3.getObjectMetadata(gom); System.out.println("etag: " + om.getETag()); System.out.println("last modified: " + om.getLastModified().toString()); } catch(com.emc.object.s3.S3Exception e) { System.out.println("What happened: " + e.getMessage()); }
Если используется AWS java SDK, а объект не существует, SDK выдает следующее исключение.
com.amazonaws.services.s3.model.AmazonS3Exception: Not Found
Вот пример:
try { GetObjectMetadataRequest gom = new GetObjectMetadataRequest(AWSS3Factory.S3_BUCKET, key); s3.getObjectMetadata(gom); } catch(com.amazonaws.services.s3.model.AmazonS3Exception e) { System.out.println("What happened: " + e.getMessage()); }
Проверьте, существует ли объект, чтобы определить, нужен ли putObject.
Если проверка существования объекта для определения того, нужен ли putObject, рассмотрите возможность использования условных методов PutObjectRequests:
withIfMatch() and withIfNoneMatch().
Оба этих метода требуют значения etag объекта и используют заголовки "if-match","if-none-match" в запросе PUT.
Существуют также методы withIfUnmodifiedSince() и withIfModifiedSince(), каждый из которых принимает объект Date.
Если etag или md5 недоступны, их необходимо извлечь с помощью GetObjectMetadataRequest.
Эффективной альтернативой было бы использование withIfUnmodifiedSince(), если Date был достаточно старым.
SR с технической поддержкой ECS
Если есть сомнения в существовании объекта, отправьте сервисную заявку в службу поддержки ECS.