From 121c3bc96a273790414ae114082053cb649fc49a Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 25 Jun 2018 10:57:46 +0200 Subject: Fixed the lost update scenario If we get a fetchMore right between when the revision was updated and the incrementalQuery actually running, we ended up loosing the update because the result provider ended up with a too recent revision after the additional initial query. --- common/queryrunner.cpp | 6 +++++- common/queryrunner.h | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) (limited to 'common') diff --git a/common/queryrunner.cpp b/common/queryrunner.cpp index 0977940..9ac3517 100644 --- a/common/queryrunner.cpp +++ b/common/queryrunner.cpp @@ -152,7 +152,11 @@ void QueryRunner::fetch(const Sink::Query &query, const QByteArray & if (query.liveQuery()) { mResourceAccess->sendRevisionReplayedCommand(result.newRevision); } - mResultProvider->setRevision(result.newRevision); + //Initial queries do not fetch updates, so avoid updating the revision when fetching more content. + //Otherwise we end up breaking incremental updates. + if (!mResultProvider->revision()) { + mResultProvider->setRevision(result.newRevision); + } mResultProvider->initialResultSetComplete(result.replayedAll); if (mRequestFetchMore) { mRequestFetchMore = false; diff --git a/common/queryrunner.h b/common/queryrunner.h index e449570..52b5e2d 100644 --- a/common/queryrunner.h +++ b/common/queryrunner.h @@ -35,6 +35,16 @@ class QueryRunnerBase : public QObject public: typedef std::function ResultTransformation; + /// Disable query updates on revision change. Used for testing only. + void ignoreRevisionChanges(bool ignore) { + mIgnoreRevisionChanges = ignore; + } + + /// Manually triger a revision change. Used for testing only. + void triggerRevisionChange() { + revisionChanged(); + } + protected: typedef std::function()> QueryFunction; @@ -52,7 +62,9 @@ protected slots: */ void revisionChanged() { - run().exec(); + if (!mIgnoreRevisionChanges) { + run().exec(); + } } private: @@ -65,6 +77,7 @@ private: } QueryFunction queryFunction; + bool mIgnoreRevisionChanges{false}; }; /** -- cgit v1.2.3