From c98bc9500646d0991081caab1e10b946fd857bae Mon Sep 17 00:00:00 2001 From: Gareth Bowen Date: Tue, 10 May 2016 14:12:53 +1200 Subject: [PATCH] (#5145) - Update checkpoint even when no changes --- src/replicate/replicate.js | 34 +++++++++++++++++++-------- tests/integration/test.replication.js | 29 +++++++++++++++++++++++ 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/replicate/replicate.js b/src/replicate/replicate.js index a1a84d9854..01d6a72d82 100644 --- a/src/replicate/replicate.js +++ b/src/replicate/replicate.js @@ -121,11 +121,7 @@ function replicate(src, target, opts, returnValue, result) { } currentBatch = undefined; getChanges(); - }).catch(function (err) { - writingCheckpoint = false; - abortReplication('writeCheckpoint completed with error', err); - throw err; - }); + }).catch(onCheckpointError); } function getDiffs() { @@ -294,15 +290,33 @@ function replicate(src, target, opts, returnValue, result) { if (changes.results.length > 0) { changesOpts.since = changes.last_seq; getChanges(); + processPendingBatch(true); } else { - if (continuous) { - changesOpts.live = true; - getChanges(); + + var complete = function() { + if (continuous) { + changesOpts.live = true; + getChanges(); + } else { + changesCompleted = true; + } + processPendingBatch(true); + }; + + // update the checkpoint so we start from the right seq next time + if (!currentBatch && changes.last_seq > last_seq) { + writingCheckpoint = true; + checkpointer.writeCheckpoint(changes.last_seq, + session).then(function () { + writingCheckpoint = false; + result.last_seq = last_seq = changes.last_seq; + complete(); + }) + .catch(onCheckpointError); } else { - changesCompleted = true; + complete(); } } - processPendingBatch(true); } diff --git a/tests/integration/test.replication.js b/tests/integration/test.replication.js index 37d5cf4fc5..1a05f01f9a 100644 --- a/tests/integration/test.replication.js +++ b/tests/integration/test.replication.js @@ -1548,6 +1548,35 @@ adapters.forEach(function (adapters) { }); }); + it('Empty replication updates checkpoint (#5145)', + function (done) { + var db = new PouchDB(dbs.name); + var remote = new PouchDB(dbs.remote); + var docs1 = [ {_id: '0', integer: 0} ]; + remote.bulkDocs({ docs: docs1 }, function () { + var filter = function () { + return false; + }; + db.replicate.from(remote, { + filter: filter + }, function (err, result) { + result.ok.should.equal(true); + result.docs_written.should.equal(0); + result.docs_read.should.equal(0); + result.last_seq.should.equal(1); + db.replicate.from(remote, { + filter: filter + }, function (err, result) { + result.ok.should.equal(true); + result.docs_written.should.equal(0); + result.docs_read.should.equal(0); + result.last_seq.should.equal(1); + done(); + }); + }); + }); + }); + it('Replication with deleted doc', function (done) { var db = new PouchDB(dbs.name); var remote = new PouchDB(dbs.remote);