From f5b254c87a993988c9cb1fd06b5635f1a6b20f9f Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 3 Jun 2016 09:38:03 +0200 Subject: Deal with errors in the change-replay job. --- common/changereplay.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/common/changereplay.cpp b/common/changereplay.cpp index aebfdb0..688f47b 100644 --- a/common/changereplay.cpp +++ b/common/changereplay.cpp @@ -76,6 +76,14 @@ KAsync::Job ChangeReplay::replayNextRevision() [](const Storage::Error &) {}); const qint64 topRevision = Storage::maxRevision(mainStoreTransaction); + auto recordReplayedRevision = [this](qint64 revision) { + auto replayStoreTransaction = mChangeReplayStore.createTransaction(Storage::ReadWrite, [](const Sink::Storage::Error &error) { + Warning() << error.message; + }); + replayStoreTransaction.openDatabase().write("lastReplayedRevision", QByteArray::number(revision)); + replayStoreTransaction.commit(); + }; + if (lastReplayedRevision < topRevision) { Trace() << "Changereplay from " << lastReplayedRevision << " to " << topRevision; qint64 revision = lastReplayedRevision + 1; @@ -92,14 +100,15 @@ KAsync::Job ChangeReplay::replayNextRevision() return false; }, [key](const Storage::Error &) { ErrorMsg() << "Failed to replay change " << key; }); - return replayJob.then([this, revision]() { - auto replayStoreTransaction = mChangeReplayStore.createTransaction(Storage::ReadWrite, [](const Sink::Storage::Error &error) { - Warning() << error.message; - }); - replayStoreTransaction.openDatabase().write("lastReplayedRevision", QByteArray::number(revision)); - replayStoreTransaction.commit(); + return replayJob.then([this, revision, recordReplayedRevision]() { Trace() << "Replayed until " << revision; - }).then([this]() { + recordReplayedRevision(revision); + //replay until we're done + replayNextRevision().exec(); + }, + [this, revision, recordReplayedRevision](int, QString) { + Trace() << "Change replay failed" << revision; + recordReplayedRevision(revision); //replay until we're done replayNextRevision().exec(); }); -- cgit v1.2.3