Couchbase Java SDK 因 BUCKET_NOT_AVAILABLE 超时

问题描述

我正在执行 Couchbase Java SDK 3.0.9 查找操作,如下所示:

// Set up
bucket = cluster.bucket("my_bucket")
collection = bucket.defaultCollection()
// Look up operation
val specs = listof(LookupInSpecstandard.get("hash"))
collection.lookupIn(id,specs)

我得到的错误是 BUCKET_NOT_AVAILABLE。这是完整的消息:

com.couchbase.client.core.error.UnambiguousTimeoutException: SubdocgetRequest,Reason: TIMEOUT {"cancelled":true,"completed":true,"coreId":"0xdb7f8e4800000003","idempotent":true,"reason":"TIMEOUT","requestId":608806,"requestType":"SubdocgetRequest","retried":39,"retryReasons":["BUCKET_NOT_AVAILABLE"],"service":{"bucket":"export","collection":"_default","documentId":"export:main","opaque":"0xcfefb","scope":"_default","type":"kv"},"timeoutMs":15000,"timings":{"totalMicros":15008977}}

奇怪的是,这段代码已经好几个月没有碰过了,查找突然爆发了。 CB 集群工作正常。它的版本是 企业版 6.5.1 内部版本 6299。

你知道哪里出了问题吗?

解决方法

请注意,在 Couchbase Java SDK 3.x 中,Cluster::bucket 方法会立即返回,并继续在后台打开存储桶。因此,您执行的第一个操作 - 此处为 lookupIn - 需要等待该资源打开完成才能继续。访问 Couchbase 存储分区的时间似乎比平时稍长,并且您超时了。

我建议在打开一个bucket后使用Bucket::waitUntilReady方法,阻塞直到资源打开完成:

bucket = cluster.bucket("my_bucket")
bucket.waitUntilReady(Duration.ofMinutes(1));