【问题标题】:Couchbase deleted documents reappearing in databaseCouchbase 删除的文档重新出现在数据库中
【发布时间】:2021-02-15 07:08:50
【问题描述】:

我们遇到了一个问题,即已删除的文档重新出现在我们的 Couchbase 服务器上。

我们有一个在 CBL 上创建文档的场景。这些文档同步到服务器。用户意识到发生了错误并将文档标记为不正确。然后,管理员可以在服务器上查看所有标记的文档并将它们从服务器中删除。同步网关已设置为仅同步这些类型的文档,即一旦在服务器上对这些文档进行了编辑,更改就不会同步回 CBL。

这是发生的过程:

  1. 文档在 CBL 上创建,TTL 为 15 天并同步到同步
  2. 文档在 CBL 上更新并同步到同步网关。
  3. 文档已从 Couchbase 服务器存储桶中删除,并带有 DELETE N1QL 查询。
  4. 从获取的存储桶中删除文档后 过几天又随机添加了。
  5. 仅适用于 仍在设备上,即不早于 15 天的 TTL,添加 回到桶里。

我们尝试将元数据清除间隔增加到 15 天以上,但这并没有解决问题。

有没有人有任何建议或可能知道这里可能存在什么问题?

  • Couchbase Server Community Edition 6.5.1 build 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);
                    }
                }`,
        }
    }
}

【问题讨论】:

    标签: couchbase couchbase-lite couchbase-sync-gateway


    【解决方案1】:

    在共享存储桶访问模式下(enable_shared_bucket_access:true),a N1QL delete on a document creates a tombstone。墓碑总是同步的。服务器上的元数据清除间隔设置决定了在服务器上清除墓碑的时间段。因此通常将其设置为与客户端的最大分区窗口匹配的值 - 即确保所有断开连接的客户端都有机会获取已删除的文档。因此,将其设置为 > 15 天仅意味着墓碑将在 15 天后被清除,因此墓碑文档将在此期间同步到客户端。

    在您的情况下,如果您不希望将文档同步到客户端,因为文档的生命周期是通过 expireDate() 在 CBL 端独立管理的,那么请清除文档而不是在服务器上删除它。

    【讨论】:

    • 感谢您的解释!但我想你可能误解了我的问题。我已经更新了我的问题以提供进一步的背景信息。看到文档更新需要与服务器同步,我无法立即从设备中清除文档。
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多