我有一种情况,即实时同步拒绝自己获取某些文件,使得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中的此消息崩溃。
在我们重新创建这样的测试系统之后,这种情况开始发生了:
1:将实时Couchdb复制到测试系统。
2:测试Couchdb被修改并变得领先于实时系统。导致复制冲突。
3:删除测试CouchDb,从开始重新运行复制,创建一个新的测试系统。
某些文档现在有这个问题,尽管之前从未在PouchDb中,并且PouchDb应该没有现有的复制检查点,因为数据库是live的全新复制。甚至破坏PouchDb也行不通。即使删除indexDb 小包也无法解决问题。我不知道还有什么可以尝试的。
-Edit,我已经将问题缩小了一点,该文件有大量已删除的冲突修订版。它似乎陷入了循环中。