问题描述
我们遇到了一个问题,即已删除的文档重新出现在我们的 Couchbase 服务器上。
我们有一个在 CBL 上创建文档的场景。这些文档同步到服务器。用户意识到发生了错误并将文档标记为不正确。在服务器上,管理员可以查看所有被标记的文档并从服务器中删除它们。同步网关已设置为仅同步这些类型的文档,即在服务器上对这些文档进行编辑后,更改不会同步回 CBL。
这是发生的过程:
- 文档是在 CBL 上创建的,TTL 为 15 天并同步到同步
- 文档在 CBL 上更新并同步到同步网关。
- 使用 DELETE 从 Couchbase Server 存储桶中删除文档 N1QL 查询。
- 文档从bucket中删除后得到 几天内再次随机添加。
- 只有符合以下条件的文件 仍然在设备上,即不超过 15 天的 TTL,被添加 回到桶里。
我们尝试将元数据清除间隔增加到 15 天以上,但这并没有解决问题。
有没有人有任何建议或可能知道这里可能存在什么问题?
- Couchbase Server 社区版 6.5.1 内部版本 6299
- 同步网关 2.7.3
- Couchbase Lite Android 2.8.1
提前致谢!
PS:这是我们带有同步功能的同步网关配置:
"log": [
"*"
],"adminInterface": "0.0.0.0:4985","interface": "0.0.0.0:4984","databases": {
"prod": {
"server": "http://localhost:8091","bucket": "prod_bukcet","username": "sync_gateway","password": "XXX","enable_shared_bucket_access": true,"import_docs": "continuous","use_views": true,"users": {
"user_X": {
"password": "XXX","admin_channels": ["*"],"disabled": false
}
},"sync":`
function sync(doc,oldDoc) {
/* sanity check */
// check if document was removed from server or via SDK
// In this case,just return
if (isRemoved()) {
return;
}
//Only sync down documents that are created on the server
if (doc.deviceDoc == true) {
channel("server");
} else {
if (doc.siteId) {
channel(doc.siteId);
} else {
channel("devices");
}
}
// This is when document is removed via SDK or directly on server
function isRemoved() {
return (isDelete() && oldDoc == null);
}
function isDelete() {
return (doc._deleted == true);
}
}`,}
}
}
解决方法
在共享存储桶访问模式下 (enable_shared_bucket_access:true),a N1QL delete on a document creates a tombstone。墓碑总是同步的。服务器上的元数据清除间隔设置决定了在服务器上清除逻辑删除的时间段。因此,通常将其设置为与客户端的最大分区窗口匹配的值——即确保所有断开连接的客户端都有机会获得已删除的文档。因此,将其设置为 > 15 天仅意味着墓碑将在 15 天后被清除,因此墓碑文档将在此期间同步到客户端。
在您的情况下,如果您不希望文档被同步到客户端,因为文档的生命周期是通过 expireDate() 在 CBL 端独立管理的,那么清除文档而不是在服务器上删除它。