PouchDb Репликация одного документа приводит к огромному использованию памяти, затем происходит сбой - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть ситуация, когда динамическая синхронизация отказывается получать некоторые документы самостоятельно, заставляя 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 раз), каждый раз запрашивая один документ. Все они могут работать почти в одно и то же время.

Чтобы упростить это, я комментировал почти каждый раз, когда эта функция использовалась, по одному, пока не нашел точный документ, вызывающий проблему. Я сократил его до очень простой команды, напрямую вызывающей проблемный документ

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

Это никогда не закончится, браузер быстро израсходует память и вылетит. Это, вероятно, связано с проблемами отката базы данных в этом вопросе здесь Можно ли получить последний номер последовательности PouchDB?

Когда вы пытаетесь скопировать этот документ, в указанном выше коде событие не запускается. Chrome / firefox будет просто сидеть, постепенно используя больше оперативной памяти и увеличивая нагрузку на процессор, после чего браузер вылетает с этим сообщением в chrome.

enter image description here

Это начало происходить после того, как мы заново создали нашу тестовую систему следующим образом:

1: Live Couchdb реплицируется в тестовую систему.

2: тестовый Couchdb модифицируется и становится впереди работающей системы. Причины конфликтов репликации.

3: тестовый CouchDb удаляется, и репликация перезапускается с самого начала, создавая новую тестовую систему.

Некоторые документы теперь имеют эту проблему, несмотря на то, что никогда ранее не находились в PouchDb, и не должно быть никаких контрольных точек репликации для PouchDb, поскольку база данных является свежей репликацией в реальном времени. Даже уничтожение PouchDb не работает. Даже удаление indexDb pouch не решает проблему. Я не уверен, что еще попробовать.

- Редактировать, я немного сузил проблему, в документе тонна удаленных ревизий от конфликтов. Кажется, они застряли в них.

...