У меня есть ситуация, когда динамическая синхронизация отказывается получать некоторые документы самостоятельно, заставляя 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.
Это начало происходить после того, как мы заново создали нашу тестовую систему следующим образом:
1: Live Couchdb реплицируется в тестовую систему.
2: тестовый Couchdb модифицируется и становится впереди работающей системы. Причины конфликтов репликации.
3: тестовый CouchDb удаляется, и репликация перезапускается с самого начала, создавая новую тестовую систему.
Некоторые документы теперь имеют эту проблему, несмотря на то, что никогда ранее не находились в PouchDb, и не должно быть никаких контрольных точек репликации для PouchDb, поскольку база данных является свежей репликацией в реальном времени. Даже уничтожение PouchDb не работает. Даже удаление indexDb pouch не решает проблему. Я не уверен, что еще попробовать.
- Редактировать, я немного сузил проблему, в документе тонна удаленных ревизий от конфликтов. Кажется, они застряли в них.