summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-01-23 11:17:35 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-01-23 11:25:24 +0100
commit3356db6f1fe75f39a5f6038e94e5af4b5e99f138 (patch)
tree93976d1eb8879a1b9966d491a1ecd25a70540ae0
parent6003ae63e45485d1f1c76ea378900bc5242465cd (diff)
downloadsink-3356db6f1fe75f39a5f6038e94e5af4b5e99f138.tar.gz
sink-3356db6f1fe75f39a5f6038e94e5af4b5e99f138.zip
Ensure we don't accidentally spawn more transactions than necessary.
-rw-r--r--common/storage/entitystore.cpp7
-rw-r--r--common/storage/entitystore.h1
-rw-r--r--common/synchronizer.cpp9
3 files changed, 13 insertions, 4 deletions
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
111void EntityStore::startTransaction(Sink::Storage::DataStore::AccessMode accessMode) 111void EntityStore::startTransaction(Sink::Storage::DataStore::AccessMode accessMode)
112{ 112{
113 SinkTraceCtx(d->logCtx) << "Starting transaction: " << accessMode; 113 SinkTraceCtx(d->logCtx) << "Starting transaction: " << accessMode;
114 Q_ASSERT(!d->transaction);
114 Sink::Storage::DataStore store(Sink::storageLocation(), d->resourceContext.instanceId(), accessMode); 115 Sink::Storage::DataStore store(Sink::storageLocation(), d->resourceContext.instanceId(), accessMode);
115 d->transaction = store.createTransaction(accessMode); 116 d->transaction = store.createTransaction(accessMode);
116 Q_ASSERT(d->transaction.validateNamedDatabases()); 117 Q_ASSERT(d->transaction.validateNamedDatabases());
@@ -119,6 +120,7 @@ void EntityStore::startTransaction(Sink::Storage::DataStore::AccessMode accessMo
119void EntityStore::commitTransaction() 120void EntityStore::commitTransaction()
120{ 121{
121 SinkTraceCtx(d->logCtx) << "Committing transaction"; 122 SinkTraceCtx(d->logCtx) << "Committing transaction";
123 Q_ASSERT(d->transaction);
122 d->transaction.commit(); 124 d->transaction.commit();
123 d->transaction = Storage::DataStore::Transaction(); 125 d->transaction = Storage::DataStore::Transaction();
124} 126}
@@ -130,6 +132,11 @@ void EntityStore::abortTransaction()
130 d->transaction = Storage::DataStore::Transaction(); 132 d->transaction = Storage::DataStore::Transaction();
131} 133}
132 134
135bool EntityStore::hasTransaction() const
136{
137 return d->transaction;
138}
139
133void EntityStore::copyBlobs(ApplicationDomain::ApplicationDomainType &entity, qint64 newRevision) 140void EntityStore::copyBlobs(ApplicationDomain::ApplicationDomainType &entity, qint64 newRevision)
134{ 141{
135 const auto directory = d->entityBlobStoragePath(entity.identifier()); 142 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:
51 void startTransaction(Sink::Storage::DataStore::AccessMode); 51 void startTransaction(Sink::Storage::DataStore::AccessMode);
52 void commitTransaction(); 52 void commitTransaction();
53 void abortTransaction(); 53 void abortTransaction();
54 bool hasTransaction() const;
54 55
55 QVector<QByteArray> fullScan(const QByteArray &type); 56 QVector<QByteArray> fullScan(const QByteArray &type);
56 QVector<QByteArray> indexLookup(const QByteArray &type, const QueryBase &query, QSet<QByteArray> &appliedFilters, QByteArray &appliedSorting); 57 QVector<QByteArray> indexLookup(const QByteArray &type, const QueryBase &query, QSet<QByteArray> &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)
62 62
63Storage::EntityStore &Synchronizer::store() 63Storage::EntityStore &Synchronizer::store()
64{ 64{
65 mEntityStore->startTransaction(Sink::Storage::DataStore::ReadOnly); 65 Q_ASSERT(mEntityStore->hasTransaction());
66 return *mEntityStore; 66 return *mEntityStore;
67} 67}
68 68
@@ -385,11 +385,13 @@ KAsync::Job<void> Synchronizer::processSyncQueue()
385 const auto request = mSyncRequestQueue.takeFirst(); 385 const auto request = mSyncRequestQueue.takeFirst();
386 return KAsync::syncStart<void>([this] { 386 return KAsync::syncStart<void>([this] {
387 mMessageQueue->startTransaction(); 387 mMessageQueue->startTransaction();
388 mEntityStore->startTransaction(Sink::Storage::DataStore::ReadOnly);
388 mSyncInProgress = true; 389 mSyncInProgress = true;
389 }) 390 })
390 .then(processRequest(request)) 391 .then(processRequest(request))
391 .then<void>([this](const KAsync::Error &error) { 392 .then<void>([this](const KAsync::Error &error) {
392 SinkTraceCtx(mLogCtx) << "Sync request processed"; 393 SinkTraceCtx(mLogCtx) << "Sync request processed";
394 mEntityStore->abortTransaction();
393 mSyncTransaction.abort(); 395 mSyncTransaction.abort();
394 mMessageQueue->commit(); 396 mMessageQueue->commit();
395 mSyncStore.clear(); 397 mSyncStore.clear();
@@ -409,7 +411,6 @@ KAsync::Job<void> Synchronizer::processSyncQueue()
409void Synchronizer::commit() 411void Synchronizer::commit()
410{ 412{
411 mMessageQueue->commit(); 413 mMessageQueue->commit();
412 mEntityStore->abortTransaction();
413 mSyncTransaction.commit(); 414 mSyncTransaction.commit();
414 mSyncStore.clear(); 415 mSyncStore.clear();
415 if (mSyncInProgress) { 416 if (mSyncInProgress) {
@@ -472,7 +473,8 @@ KAsync::Job<void> Synchronizer::replay(const QByteArray &type, const QByteArray
472 Q_ASSERT(metadataBuffer); 473 Q_ASSERT(metadataBuffer);
473 Q_ASSERT(!mSyncStore); 474 Q_ASSERT(!mSyncStore);
474 Q_ASSERT(!mSyncTransaction); 475 Q_ASSERT(!mSyncTransaction);
475 mEntityStore->startTransaction(Storage::DataStore::ReadOnly); 476 //The entitystore transaction is handled by processSyncQueue
477 Q_ASSERT(mEntityStore->hasTransaction());
476 478
477 const auto operation = metadataBuffer ? metadataBuffer->operation() : Sink::Operation_Creation; 479 const auto operation = metadataBuffer ? metadataBuffer->operation() : Sink::Operation_Creation;
478 const auto uid = Sink::Storage::DataStore::uidFromKey(key); 480 const auto uid = Sink::Storage::DataStore::uidFromKey(key);
@@ -525,7 +527,6 @@ KAsync::Job<void> Synchronizer::replay(const QByteArray &type, const QByteArray
525 } 527 }
526 mSyncStore.clear(); 528 mSyncStore.clear();
527 mSyncTransaction.commit(); 529 mSyncTransaction.commit();
528 mEntityStore->abortTransaction();
529 }); 530 });
530} 531}
531 532