GCS:重试BlobWriteChannel.flushBuffer中的410错误

时间:2019-07-05 18:39:35

标签: google-cloud-storage

我们正在使用GCS存储Blob文件。我们提供了由内部库提供的接口的GCS实现。该实现返回一个WritableByteChannel,该值由库使用。这意味着,添加重试逻辑对我们来说不是一个简单的选择。查看下面的堆栈跟踪,我们发现它是通过BlobWriteChannel.flushBuffer方法创建的。

我有什么办法可以重试这些错误?

Caused by: com.google.cloud.storage.StorageException: 410 Gone
! {
!  "error": {
!   "errors": [
!    {
!     "domain": "global",
!     "reason": "backendError",
!     "message": "Backend Error"
!    }
!   ],
!   "code": 500,
!   "message": "Backend Error"
!  }
! }
! 
! at com.google.cloud.storage.spi.v1.HttpStorageRpc.translate(HttpStorageRpc.java:227)
! at com.google.cloud.storage.spi.v1.HttpStorageRpc.write(HttpStorageRpc.java:762)
! at com.google.cloud.storage.BlobWriteChannel$1.run(BlobWriteChannel.java:51)
! at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
! at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:105)
! at com.google.cloud.RetryHelper.run(RetryHelper.java:76)
! at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:50)
! at com.google.cloud.storage.BlobWriteChannel.flushBuffer(BlobWriteChannel.java:44)
! at com.google.cloud.BaseWriteChannel.close(BaseWriteChannel.java:151)

2 个答案:

答案 0 :(得分:0)

这是错误410消失了。根据GCP documentation,“ 410走了”表示您正在尝试通过重用无效的会话来上传文件。但是,您观察到的此错误似乎是一个已知问题,已在此link上报告。我建议您继续关注更新和修复的链接。

答案 1 :(得分:0)

对于后代,在大型上传或compose()调用期间,我们偶尔会看到410个GONE错误。我们正在与Google支持人员合作。引用:

截至目前,问题仅是错误而不是客户问题,并且在进行修复时,可以在客户方面进行解决。规避5xx和410错误的官方解决方法是实施重试,正如您自己评论过的问题跟踪器条目中的此评论所指出的那样(请参阅此blog comment)。重试方法建议也可以在this discussion中看到。

要成功重试,需要捕获500和410个错误,并且作为official documentation recommends,通过为接收到不成功状态代码但仍需要上载的上载开始新的会话来实现重试。您可能缺少新的会话创建,导致重试不成功(如您先前所述)。此外,comments中建议的指数补偿是减轻问题的一种方法-请参阅docs about that