From: Peter van Dijk Date: Fri, 15 Nov 2019 12:01:01 +0000 (+0100) Subject: lmdbbackend: use nested transaction in lookup() when possible/needed X-Git-Tag: auth-4.3.0-alpha1~38^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a1c121f924be391f0c06a70fc3b8c5a5e00a4c96;p=thirdparty%2Fpdns.git lmdbbackend: use nested transaction in lookup() when possible/needed --- diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 938a3f397d..ad9b5565ba 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -450,18 +450,27 @@ std::shared_ptr LMDBBackend::getRecordsRWTran return ret; } -std::shared_ptr LMDBBackend::getRecordsROTransaction(uint32_t id) +std::shared_ptr LMDBBackend::getRecordsROTransaction(uint32_t id, std::shared_ptr rwtxn) { auto& shard =d_trecords[id % d_shards]; if(!shard.env) { + if (rwtxn) { + throw DBException("attempting to start nested transaction without open parent env"); + } shard.env = getMDBEnv( (getArg("filename")+"-"+std::to_string(id % d_shards)).c_str(), MDB_NOSUBDIR | d_asyncFlag, 0600); shard.dbi = shard.env->openDB("records", MDB_CREATE | MDB_DUPSORT); } - auto ret = std::make_shared(shard.env->getROTransaction()); - ret->db = std::make_shared(shard); - return ret; + if (rwtxn) { + auto ret = std::make_shared(rwtxn->txn->getROTransaction()); + ret->db = std::make_shared(shard); + return ret; + } else { + auto ret = std::make_shared(shard.env->getROTransaction()); + ret->db = std::make_shared(shard); + return ret; + } } @@ -571,7 +580,7 @@ void LMDBBackend::lookup(const QType &type, const DNSName &qdomain, int zoneId, DNSName relqname = qdomain.makeRelative(hunt); // cout<<"get will look for "<(d_rotxn->txn->getCursor(d_rotxn->db->dbi)); diff --git a/modules/lmdbbackend/lmdbbackend.hh b/modules/lmdbbackend/lmdbbackend.hh index 7d5e8bdb3a..5918067edf 100644 --- a/modules/lmdbbackend/lmdbbackend.hh +++ b/modules/lmdbbackend/lmdbbackend.hh @@ -252,7 +252,7 @@ private: shared_ptr d_rotxn; // for lookup and list shared_ptr d_rwtxn; // for feedrecord within begin/aborttransaction std::shared_ptr getRecordsRWTransaction(uint32_t id); - std::shared_ptr getRecordsROTransaction(uint32_t id); + std::shared_ptr getRecordsROTransaction(uint32_t id, std::shared_ptr rwtxn = nullptr); int genChangeDomain(const DNSName& domain, std::function func); int genChangeDomain(uint32_t id, std::function func); void deleteDomainRecords(RecordsRWTransaction& txn, uint32_t domain_id, uint16_t qtype=QType::ANY);