From 3356db6f1fe75f39a5f6038e94e5af4b5e99f138 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 23 Jan 2017 11:17:35 +0100 Subject: Ensure we don't accidentally spawn more transactions than necessary. --- common/storage/entitystore.cpp | 7 +++++++ common/storage/entitystore.h | 1 + common/synchronizer.cpp | 9 +++++---- 3 files changed, 13 insertions(+), 4 deletions(-) (limited to 'common') diff --git a/common/storage/entitystore.cpp b/common/storage/entitystore.cpp index 6c341e2..51e5da7 100644 --- a/common/storage/entitystore.cpp +++ b/common/storage/entitystore.cpp @@ -111,6 +111,7 @@ EntityStore::EntityStore(const ResourceContext &context, const Log::Context &ctx void EntityStore::startTransaction(Sink::Storage::DataStore::AccessMode accessMode) { SinkTraceCtx(d->logCtx) << "Starting transaction: " << accessMode; + Q_ASSERT(!d->transaction); Sink::Storage::DataStore store(Sink::storageLocation(), d->resourceContext.instanceId(), accessMode); d->transaction = store.createTransaction(accessMode); Q_ASSERT(d->transaction.validateNamedDatabases()); @@ -119,6 +120,7 @@ void EntityStore::startTransaction(Sink::Storage::DataStore::AccessMode accessMo void EntityStore::commitTransaction() { SinkTraceCtx(d->logCtx) << "Committing transaction"; + Q_ASSERT(d->transaction); d->transaction.commit(); d->transaction = Storage::DataStore::Transaction(); } @@ -130,6 +132,11 @@ void EntityStore::abortTransaction() d->transaction = Storage::DataStore::Transaction(); } +bool EntityStore::hasTransaction() const +{ + return d->transaction; +} + void EntityStore::copyBlobs(ApplicationDomain::ApplicationDomainType &entity, qint64 newRevision) { const auto directory = d->entityBlobStoragePath(entity.identifier()); diff --git a/common/storage/entitystore.h b/common/storage/entitystore.h index fe75a02..46410cd 100644 --- a/common/storage/entitystore.h +++ b/common/storage/entitystore.h @@ -51,6 +51,7 @@ public: void startTransaction(Sink::Storage::DataStore::AccessMode); void commitTransaction(); void abortTransaction(); + bool hasTransaction() const; QVector fullScan(const QByteArray &type); QVector indexLookup(const QByteArray &type, const QueryBase &query, QSet &appliedFilters, QByteArray &appliedSorting); diff --git a/common/synchronizer.cpp b/common/synchronizer.cpp index f731b31..3cd0cb6 100644 --- a/common/synchronizer.cpp +++ b/common/synchronizer.cpp @@ -62,7 +62,7 @@ void Synchronizer::enqueueCommand(int commandId, const QByteArray &data) Storage::EntityStore &Synchronizer::store() { - mEntityStore->startTransaction(Sink::Storage::DataStore::ReadOnly); + Q_ASSERT(mEntityStore->hasTransaction()); return *mEntityStore; } @@ -385,11 +385,13 @@ KAsync::Job Synchronizer::processSyncQueue() const auto request = mSyncRequestQueue.takeFirst(); return KAsync::syncStart([this] { mMessageQueue->startTransaction(); + mEntityStore->startTransaction(Sink::Storage::DataStore::ReadOnly); mSyncInProgress = true; }) .then(processRequest(request)) .then([this](const KAsync::Error &error) { SinkTraceCtx(mLogCtx) << "Sync request processed"; + mEntityStore->abortTransaction(); mSyncTransaction.abort(); mMessageQueue->commit(); mSyncStore.clear(); @@ -409,7 +411,6 @@ KAsync::Job Synchronizer::processSyncQueue() void Synchronizer::commit() { mMessageQueue->commit(); - mEntityStore->abortTransaction(); mSyncTransaction.commit(); mSyncStore.clear(); if (mSyncInProgress) { @@ -472,7 +473,8 @@ KAsync::Job Synchronizer::replay(const QByteArray &type, const QByteArray Q_ASSERT(metadataBuffer); Q_ASSERT(!mSyncStore); Q_ASSERT(!mSyncTransaction); - mEntityStore->startTransaction(Storage::DataStore::ReadOnly); + //The entitystore transaction is handled by processSyncQueue + Q_ASSERT(mEntityStore->hasTransaction()); const auto operation = metadataBuffer ? metadataBuffer->operation() : Sink::Operation_Creation; const auto uid = Sink::Storage::DataStore::uidFromKey(key); @@ -525,7 +527,6 @@ KAsync::Job Synchronizer::replay(const QByteArray &type, const QByteArray } mSyncStore.clear(); mSyncTransaction.commit(); - mEntityStore->abortTransaction(); }); } -- cgit v1.2.3