com.google.cloud.storage.StorageException 404 в blob.getContent () - PullRequest
0 голосов
/ 26 апреля 2018

Я использую сервис, который создает или обновляет объекты в корзине GCP. Т.е. мой код проверяет, существует ли объект, и если он это делает, мой код читает его, обновляет и записывает обратно. Иногда я получаю исключение при попытке прочитать объект. Мой код:

Storage storage = googleStorage.get();
BlobId blobId = BlobId.of(STORAGE_BUCKET, "path/to.obj"));
Blob blob = storage.get(blobId);

if (blob == null) return null;

byte[] blobContent = blob.getContent();
...

Трассировка стека:

...
at com.google.cloud.storage.Blob.getContent(Blob.java:455)
at com.google.cloud.storage.StorageImpl.readAllBytes(StorageImpl.java:461)
at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:51)
at com.google.cloud.RetryHelper.run(RetryHelper.java:74)
at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:89)
at com.google.cloud.storage.StorageImpl$16.call(StorageImpl.java:461)
at com.google.cloud.storage.StorageImpl$16.call(StorageImpl.java:464)
at com.google.cloud.storage.spi.v1.HttpStorageRpc.load(HttpStorageRpc.java:588)
at com.google.cloud.storage.spi.v1.HttpStorageRpc.translate(HttpStorageRpc.java:220)
No such object: bucket/path/to.obj
com.google.cloud.storage.StorageException: 404 Not Found

Я бы ожидал получить значение NULL в blob, если объект не существует, или возможность читать, если blob не равно NULL.

Это приводит к тому, что объект обновляется несколько раз (не уверен, что это происходит из-за того, что мой код повторяет вызов или из-за чего-то, что делает библиотека хранения).

Я использую google-cloud-storage 1.27.0, это происходит примерно один раз на ~ 10 000 объектов.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я проверил предоставленный вами код, и он, кажется, работает нужным образом - объекту Blob присваивается значение NULL, если объект облачного хранилища не может быть найден или путь указан неверно.

Частота неудач весьма незначительна. Возможно, если вы настроите экспоненциальный откат с помощью класса RetryParams , то вы сможете устранить или уменьшить влияние этих отказов.

0 голосов
/ 27 апреля 2018

Вам не нужно BlobId. Вы можете использовать этот метод:

Blob blob = storage.get(bucketName).get(pathToObject);

Этот метод вернет null, если BLOB-объект не существует по указанному пути.

...