PouchDb Replicate of single document causes huge memory usage, then crash

烂漫一生 提交于 2020-01-03 05:07:24

问题


I have a situation where live sync is refusing to get some documents on it's own, making PouchDb.get return saying the document is not found (despite it being there in CouchDb that it is replicating from).

Reading through the documentation, it suggests doing a manual replicate first, then a sync. So I changed my code to first replicate

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);
    });
})

Then get the doc

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

This function is called multiple times (about 8 times on average), each time requesting a single doc. They may all run at almost the exact same time.

To simplify this, I commented out nearly every single time this function was used, one at a time, until I found the exact document causing the problem. I reduced it down to a very simple command directly calling the problem document

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

This will never finish, the browser will rapidly use up memory and crash. It is probably related to database rollback issues in this question here Is it possible to get the latest seq number of PouchDB?

When you attempt to replicate this document, no event is ever fired in the above code. Chrome/firefox will just sit, gradually using more ram and maxing the CPU then the browser crashes with this message in chrome.

This started happening after we re-created our test system like this:

1: A live Couchdb is replicated to a test system.

2: The test Couchdb is modified and becomes ahead of the live system. Causing replication conflicts.

3: The test CouchDb is deleted, and the replication rerun from start, creating a fresh test system.

Certain documents now have this problem, despite never being in PouchDb before, and there should be no existing replication checkpoints for PouchDb since the database is a fresh replication of live. Even destroying the PouchDb doesn't work. Even removing the indexDb pouch doesn't solve it. I am not sure what else to try.

-Edit, I've narrowed down the problem a little bit, the document has a ton of deleted revisions from conflicts. It seems to get stuck looping through them.

来源:https://stackoverflow.com/questions/50045600/pouchdb-replicate-of-single-document-causes-huge-memory-usage-then-crash

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!