summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/storage.h2
-rw-r--r--common/storage_lmdb.cpp44
-rw-r--r--tests/storagebenchmark.cpp8
3 files changed, 43 insertions, 11 deletions
diff --git a/common/storage.h b/common/storage.h
index 9fe4e99..da225ef 100644
--- a/common/storage.h
+++ b/common/storage.h
@@ -59,6 +59,8 @@ public:
59 bool commit(const std::function<void(const Storage::Error &error)> &errorHandler = std::function<void(const Storage::Error &error)>()); 59 bool commit(const std::function<void(const Storage::Error &error)> &errorHandler = std::function<void(const Storage::Error &error)>());
60 void abort(); 60 void abort();
61 61
62 void setAutocommit(int interval);
63
62 /** 64 /**
63 * Write a value 65 * Write a value
64 */ 66 */
diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp
index 983d0e2..86d76a0 100644
--- a/common/storage_lmdb.cpp
+++ b/common/storage_lmdb.cpp
@@ -52,14 +52,17 @@ int getErrorCode(int e)
52class Storage::Transaction::Private 52class Storage::Transaction::Private
53{ 53{
54public: 54public:
55 Private(MDB_txn *_txn, MDB_dbi _dbi, bool _allowDuplicates, const std::function<void(const Storage::Error &error)> &_defaultErrorHandler, const QString &_name) 55 Private(MDB_txn *_txn, MDB_dbi _dbi, bool _allowDuplicates, const std::function<void(const Storage::Error &error)> &_defaultErrorHandler, const QString &_name, MDB_env *_env)
56 : transaction(_txn), 56 : env(_env),
57 transaction(_txn),
57 dbi(_dbi), 58 dbi(_dbi),
58 allowDuplicates(_allowDuplicates), 59 allowDuplicates(_allowDuplicates),
59 defaultErrorHandler(_defaultErrorHandler), 60 defaultErrorHandler(_defaultErrorHandler),
60 name(_name), 61 name(_name),
61 implicitCommit(false), 62 implicitCommit(false),
62 error(false) 63 error(false),
64 autoCommitInterval(0),
65 modificationCounter(0)
63 { 66 {
64 67
65 } 68 }
@@ -68,6 +71,7 @@ public:
68 71
69 } 72 }
70 73
74 MDB_env *env;
71 MDB_txn *transaction; 75 MDB_txn *transaction;
72 MDB_dbi dbi; 76 MDB_dbi dbi;
73 bool allowDuplicates; 77 bool allowDuplicates;
@@ -75,6 +79,8 @@ public:
75 QString name; 79 QString name;
76 bool implicitCommit; 80 bool implicitCommit;
77 bool error; 81 bool error;
82 int autoCommitInterval;
83 int modificationCounter;
78}; 84};
79 85
80Storage::Transaction::Transaction() 86Storage::Transaction::Transaction()
@@ -128,6 +134,13 @@ void Storage::Transaction::abort()
128 d->transaction = nullptr; 134 d->transaction = nullptr;
129} 135}
130 136
137void Storage::Transaction::setAutocommit(int interval)
138{
139 if (d) {
140 d->autoCommitInterval = interval;
141 }
142}
143
131bool Storage::Transaction::write(const QByteArray &sKey, const QByteArray &sValue, const std::function<void(const Storage::Error &error)> &errorHandler) 144bool Storage::Transaction::write(const QByteArray &sKey, const QByteArray &sValue, const std::function<void(const Storage::Error &error)> &errorHandler)
132{ 145{
133 if (!d || !d->transaction) { 146 if (!d || !d->transaction) {
@@ -160,6 +173,29 @@ bool Storage::Transaction::write(const QByteArray &sKey, const QByteArray &sValu
160 d->implicitCommit = true; 173 d->implicitCommit = true;
161 } 174 }
162 175
176 if (d->autoCommitInterval > 0) {
177 d->modificationCounter++;
178 if (d->modificationCounter >= d->autoCommitInterval) {
179 commit();
180
181 MDB_txn *txn;
182 rc = mdb_txn_begin(d->env, NULL, 0, &txn);
183 if (!rc) {
184 //TODO: Move opening of dbi into Transaction for different named databases
185 MDB_dbi dbi;
186 rc = mdb_dbi_open(txn, NULL, d->allowDuplicates ? MDB_DUPSORT : 0, &dbi);
187 if (rc) {
188 errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while opening transaction: " + QByteArray(mdb_strerror(rc))));
189 } else {
190 d->transaction = txn;
191 d->dbi = dbi;
192 }
193 }
194
195 d->modificationCounter = 0;
196 }
197 }
198
163 return !rc; 199 return !rc;
164} 200}
165 201
@@ -387,7 +423,7 @@ Storage::Transaction Storage::createTransaction(AccessMode type, const std::func
387 errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while opening transaction: " + QByteArray(mdb_strerror(rc)))); 423 errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while opening transaction: " + QByteArray(mdb_strerror(rc))));
388 return Transaction(); 424 return Transaction();
389 } 425 }
390 return Transaction(new Transaction::Private(txn, dbi, d->allowDuplicates, defaultErrorHandler(), d->name)); 426 return Transaction(new Transaction::Private(txn, dbi, d->allowDuplicates, defaultErrorHandler(), d->name, d->env));
391 } else { 427 } else {
392 if (rc) { 428 if (rc) {
393 errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while beginning transaction: " + QByteArray(mdb_strerror(rc)))); 429 errorHandler(Error(d->name.toLatin1(), ErrorCodes::GenericError, "Error while beginning transaction: " + QByteArray(mdb_strerror(rc))));
diff --git a/tests/storagebenchmark.cpp b/tests/storagebenchmark.cpp
index fba72ad..ce1005d 100644
--- a/tests/storagebenchmark.cpp
+++ b/tests/storagebenchmark.cpp
@@ -97,14 +97,8 @@ private Q_SLOTS:
97 auto event = createEvent(); 97 auto event = createEvent();
98 if (store) { 98 if (store) {
99 auto transaction = store->createTransaction(Akonadi2::Storage::ReadWrite); 99 auto transaction = store->createTransaction(Akonadi2::Storage::ReadWrite);
100 transaction.setAutocommit(10000);
100 for (int i = 0; i < count; i++) { 101 for (int i = 0; i < count; i++) {
101 if (i % 10000 == 0) {
102 if (i > 0) {
103 transaction.commit();
104 transaction = std::move(store->createTransaction(Akonadi2::Storage::ReadWrite));
105 }
106 }
107
108 transaction.write(keyPrefix + QByteArray::number(i), event); 102 transaction.write(keyPrefix + QByteArray::number(i), event);
109 } 103 }
110 transaction.commit(); 104 transaction.commit();