PouchDb单个文档的复制会导致大量内存使用,然后崩溃

时间:2018-04-26 14:29:10

标签: couchdb pouchdb

我有一种情况,即实时同步拒绝自己获取某些文件,使得PouchDb.get返回说文件未找到(尽管它在CouchDb中存在它正在复制)。

阅读文档,它建议先进行手动复制,然后再进行同步。所以我将代码更改为第一次复制

docId='testdoc';
return new Promise(function (resolve, reject) {
    var toReplicate=[docId];
    console.log("replicate new ", toReplicate);
    var quickReplicate = self.db.replicate.from(self.url, {
        doc_ids: toReplicate,
        // timeout: 100000, //makes no difference
        checkpoint: false, //attempt to get around bad checkpoints, but I purged all checkpoints and still have the issue
        batch_size: 10, //attempt to get around huge memory usage
        batches_limit: 1
    }).on('denied', function (err) {
        // a document failed to replicate (e.g. due to permissions)
        console.log("replicate denied", err);
        reject(err);
    }).on('complete', function (info) {
        // handle complete
        console.log("replicate complete", info, toReplicate);
        resolve(info);
    }).on('error', function (err) {
        // handle error
        console.log("replicate error", err);
        reject(err);
    }).on('change', function (change) {
        console.log("replicate change", change);
    }).on('pause', function (err) {
        console.log("replicate pause", err);
    });
})

然后获取文档

return self.db.get(docId).catch(function (err) {
        console.error(err);
        throw err;
    });

此函数被多次调用(平均约8次),每次请求一个doc。它们可能几乎都在同一时间运行。

为了简化这一点,我几乎每次都注释掉这个函数,一次一个,直到我找到导致问题的确切文档。我将其简化为一个非常简单的命令,直接调用问题文档

db.replicate.from("https://server/db",{
    doc_ids:['profile.bf778cd1c7b4e5ea9a3eced7049725a1']
}).then(function(result){
    console.log("Done",result);
});

这永远不会完成,浏览器会迅速耗尽内存并崩溃。 这可能与此问题Is it possible to get the latest seq number of PouchDB?

中的数据库回滚问题有关

当您尝试复制此文档时,上述代码中不会触发任何事件。 Chrome / firefox只会坐下来,逐渐使用更多内存并最大化CPU,然后浏览器会以Chrome中的此消息崩溃。

enter image description here

在我们重新创建这样的测试系统之后,这种情况开始发生了:

1:将实时Couchdb复制到测试系统。

2:测试Couchdb被修改并变得领先于实时系统。导致复制冲突。

3:删除测试CouchDb,从开始重新运行复制,创建一个新的测试系统。

某些文档现在有这个问题,尽管之前从未在PouchDb中,并且PouchDb应该没有现有的复制检查点,因为数据库是live的全新复制。甚至破坏PouchDb也行不通。即使删除indexDb 小包也无法解决问题。我不知道还有什么可以尝试的。

-Edit,我已经将问题缩小了一点,该文件有大量已删除的冲突修订版。它似乎陷入了循环中。

0 个答案:

没有答案