From: Kees Monshouwer Date: Tue, 27 Nov 2018 21:38:47 +0000 (+0100) Subject: auth: fetch all metadata at once X-Git-Tag: dnsdist-1.5.0-rc4~9^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=75e0d99f18cfd054374a60258203405b7f472855;p=thirdparty%2Fpdns.git auth: fetch all metadata at once --- diff --git a/pdns/dbdnsseckeeper.cc b/pdns/dbdnsseckeeper.cc index 65394273bd..f2c6881561 100644 --- a/pdns/dbdnsseckeeper.cc +++ b/pdns/dbdnsseckeeper.cc @@ -126,9 +126,7 @@ void DNSSECKeeper::clearCaches(const DNSName& name) s_keycache.erase(name); } WriteLock l(&s_metacachelock); - pair 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 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(s_metacache, nce); } } - return isset; + + return ret; } void DNSSECKeeper::getSoaEdit(const DNSName& zname, std::string& value) diff --git a/pdns/dnsseckeeper.hh b/pdns/dnsseckeeper.hh index 5ec297b0ff..cf44be5dd6 100644 --- a/pdns/dnsseckeeper.hh +++ b/pdns/dnsseckeeper.hh @@ -239,6 +239,7 @@ public: static void setMaxEntries(size_t maxEntries); + typedef std::map > 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, - composite_key< - METACacheEntry, - member , - member - >, composite_key_compare, CIStringCompare> >, + ordered_unique >, sequenced> > > metacache_t; diff --git a/regression-tests.nobackend/counters/expected_result b/regression-tests.nobackend/counters/expected_result index 917a0bc929..bb6d172327 100644 --- a/regression-tests.nobackend/counters/expected_result +++ b/regression-tests.nobackend/counters/expected_result @@ -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