]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: fetch all metadata at once 9169/head
authorKees Monshouwer <mind04@monshouwer.org>
Tue, 27 Nov 2018 21:38:47 +0000 (22:38 +0100)
committermind04 <mind04@monshouwer.org>
Wed, 27 May 2020 21:46:06 +0000 (23:46 +0200)
pdns/dbdnsseckeeper.cc
pdns/dnsseckeeper.hh
regression-tests.nobackend/counters/expected_result

index 65394273bd6e3115b4e1157fb881c6218d9d7cb8..f2c6881561e5ead57754d53631a879c9b808c14b 100644 (file)
@@ -126,9 +126,7 @@ void DNSSECKeeper::clearCaches(const DNSName& name)
     s_keycache.erase(name); 
   }
   WriteLock l(&s_metacachelock);
-  pair<metacache_t::iterator, metacache_t::iterator> range = s_metacache.equal_range(tie(name));
-  while(range.first != range.second)
-    s_metacache.erase(range.first++);
+  s_metacache.erase(name);
 }
 
 
@@ -212,43 +210,51 @@ void DNSSECKeeper::getFromMetaOrDefault(const DNSName& zname, const std::string&
 bool DNSSECKeeper::getFromMeta(const DNSName& zname, const std::string& key, std::string& value)
 {
   static int ttl = ::arg().asNum("domain-metadata-cache-ttl");
-  bool isset = false;
-  value.clear();
-  unsigned int now = time(0);
 
   if(!((++s_ops) % 100000)) {
     cleanup();
   }
 
-  if (ttl > 0) {
-    ReadLock l(&s_metacachelock);
+  value.clear();
+  time_t now = time(nullptr);
+
+  bool ret = false;
+  bool fromCache = false;
+  METAValues meta;
 
-    metacache_t::const_iterator iter = s_metacache.find(tie(zname, key));
+  if (ttl) {
+    ReadLock l(&s_metacachelock);
+    auto iter = s_metacache.find(zname);
     if(iter != s_metacache.end() && iter->d_ttd > now) {
-      value = iter->d_value;
-      return iter->d_isset;
+      meta = iter->d_value;
+      fromCache = true;
     }
   }
-  vector<string> meta;
-  d_keymetadb->getDomainMetadata(zname, key, meta);
-  if(!meta.empty()) {
-    value=std::move(*meta.begin());
-    isset = true;
+
+  if (!fromCache) {
+    d_keymetadb->getAllDomainMetadata(zname, meta);
   }
 
-  if (ttl > 0) {
+  auto iter = meta.find(key);
+  if (iter != meta.end()) {
+    if (!iter->second.empty()) {
+      value = *iter->second.begin();
+    }
+    ret = true;
+  }
+
+  if (ttl && !fromCache) {
     METACacheEntry nce;
     nce.d_domain=zname;
     nce.d_ttd = now + ttl;
-    nce.d_key= key;
-    nce.d_value = value;
-    nce.d_isset = isset;
+    nce.d_value = std::move(meta);
     {
       WriteLock l(&s_metacachelock);
       lruReplacingInsert<SequencedTag>(s_metacache, nce);
     }
   }
-  return isset;
+
+  return ret;
 }
 
 void DNSSECKeeper::getSoaEdit(const DNSName& zname, std::string& value)
index 5ec297b0ffb439f07a6540ca30977f38e9b977ce..cf44be5dd6c6d30d64493f187608a6051ebc5951 100644 (file)
@@ -239,6 +239,7 @@ public:
 
   static void setMaxEntries(size_t maxEntries);
 
+  typedef std::map<std::string, std::vector<std::string> > METAValues;
 private:
 
 
@@ -258,16 +259,14 @@ private:
   
   struct METACacheEntry
   {
-    uint32_t getTTD() const
+    time_t getTTD() const
     {
       return d_ttd;
     }
-  
+
     DNSName d_domain;
-    mutable std::string d_key, d_value;
-    mutable bool d_isset;
-    unsigned int d_ttd;
-  
+    mutable METAValues d_value;
+    time_t d_ttd;
   };
   
   struct KeyCacheTag{};
@@ -285,12 +284,7 @@ private:
   typedef multi_index_container<
     METACacheEntry,
     indexed_by<
-      ordered_unique<tag<CompositeTag>,
-        composite_key< 
-          METACacheEntry, 
-          member<METACacheEntry, DNSName, &METACacheEntry::d_domain> ,
-          member<METACacheEntry, std::string, &METACacheEntry::d_key>
-        >, composite_key_compare<std::less<DNSName>, CIStringCompare> >,
+      ordered_unique<member<METACacheEntry, DNSName, &METACacheEntry::d_domain> >,
       sequenced<tag<SequencedTag>>
     >
   > metacache_t;
index 917a0bc9293df287defa39d215a65ff149536bd0..bb6d17232750f3e4a9e4f2cadabafe45b27d0b15 100644 (file)
@@ -10,7 +10,7 @@ dnsupdate-queries=0
 dnsupdate-refused=0
 incoming-notifications=0
 key-cache-size=0
-meta-cache-size=3
+meta-cache-size=1
 open-tcp-connections=0
 overload-drops=0
 packetcache-size=4