]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
lmdbbackend: use nested transaction in lookup() when possible/needed
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 15 Nov 2019 12:01:01 +0000 (13:01 +0100)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 15 Nov 2019 12:01:01 +0000 (13:01 +0100)
modules/lmdbbackend/lmdbbackend.cc
modules/lmdbbackend/lmdbbackend.hh

index 938a3f397daf000253ad3651402d2ebb1f4fcb59..ad9b5565ba6f8098b1cc45f43f7722408b964849 100644 (file)
@@ -450,18 +450,27 @@ std::shared_ptr<LMDBBackend::RecordsRWTransaction> LMDBBackend::getRecordsRWTran
   return ret;
 }
 
-std::shared_ptr<LMDBBackend::RecordsROTransaction> LMDBBackend::getRecordsROTransaction(uint32_t id)
+std::shared_ptr<LMDBBackend::RecordsROTransaction> LMDBBackend::getRecordsROTransaction(uint32_t id, std::shared_ptr<LMDBBackend::RecordsRWTransaction> 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<RecordsROTransaction>(shard.env->getROTransaction());
-  ret->db = std::make_shared<RecordsDB>(shard);
-  return ret;
+  if (rwtxn) {
+    auto ret = std::make_shared<RecordsROTransaction>(rwtxn->txn->getROTransaction());
+    ret->db = std::make_shared<RecordsDB>(shard);
+    return ret;
+  } else {
+    auto ret = std::make_shared<RecordsROTransaction>(shard.env->getROTransaction());
+    ret->db = std::make_shared<RecordsDB>(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 "<<relqname<< " in zone "<<hunt<<" with id "<<zoneId<<endl;
-  d_rotxn = getRecordsROTransaction(zoneId);
+  d_rotxn = getRecordsROTransaction(zoneId, d_rwtxn);
 
   compoundOrdername co;
   d_getcursor = std::make_shared<MDBROCursor>(d_rotxn->txn->getCursor(d_rotxn->db->dbi));
index 7d5e8bdb3a90dadc7f7e0283434569c9d43ea2eb..5918067edf6e71085eaab998873d6d74419c03c3 100644 (file)
@@ -252,7 +252,7 @@ private:
   shared_ptr<RecordsROTransaction> d_rotxn; // for lookup and list
   shared_ptr<RecordsRWTransaction> d_rwtxn; // for feedrecord within begin/aborttransaction
   std::shared_ptr<RecordsRWTransaction> getRecordsRWTransaction(uint32_t id);
-  std::shared_ptr<RecordsROTransaction> getRecordsROTransaction(uint32_t id);
+  std::shared_ptr<RecordsROTransaction> getRecordsROTransaction(uint32_t id, std::shared_ptr<LMDBBackend::RecordsRWTransaction> rwtxn = nullptr);
   int genChangeDomain(const DNSName& domain, std::function<void(DomainInfo&)> func);
   int genChangeDomain(uint32_t id, std::function<void(DomainInfo&)> func);
   void deleteDomainRecords(RecordsRWTransaction& txn, uint32_t domain_id, uint16_t qtype=QType::ANY);