From 8eab2b67fdf83c657f996debfc238703a78b337b Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 5 May 2017 10:42:28 +0200 Subject: Don't leak transactions when copying them. Previsouly we would hit the maxreaders limit --- common/storage_lmdb.cpp | 1 + tests/storagetest.cpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp index e3685a5..cb7bca4 100644 --- a/common/storage_lmdb.cpp +++ b/common/storage_lmdb.cpp @@ -563,6 +563,7 @@ DataStore::Transaction::Transaction(Transaction &&other) : d(nullptr) DataStore::Transaction &DataStore::Transaction::operator=(DataStore::Transaction &&other) { if (&other != this) { + abort(); delete d; d = other.d; other.d = nullptr; diff --git a/tests/storagetest.cpp b/tests/storagetest.cpp index 7202628..dfb91ec 100644 --- a/tests/storagetest.cpp +++ b/tests/storagetest.cpp @@ -487,6 +487,24 @@ private slots: } } + void testCopyTransaction() + { + Sink::Storage::DataStore store(testDataPath, dbName, Sink::Storage::DataStore::ReadWrite); + { + auto transaction = store.createTransaction(Sink::Storage::DataStore::ReadWrite); + transaction.openDatabase("a", nullptr, false); + transaction.openDatabase("b", nullptr, false); + transaction.openDatabase("c", nullptr, false); + transaction.commit(); + } + auto transaction = store.createTransaction(Sink::Storage::DataStore::ReadOnly); + for (int i = 0; i < 1000; i++) { + transaction.openDatabase("a", nullptr, false); + transaction.openDatabase("b", nullptr, false); + transaction.openDatabase("c", nullptr, false); + transaction = store.createTransaction(Sink::Storage::DataStore::ReadOnly); + } + } }; QTEST_MAIN(StorageTest) -- cgit v1.2.3