From: Remi Gacogne Date: Fri, 4 Jun 2021 15:26:45 +0000 (+0200) Subject: auth: Convert DNSSECKeeper to SharedLockGuarded X-Git-Tag: dnsdist-1.7.0-alpha1~11^2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b38acd91b9903269fe148d85595483b6c6522ad6;p=thirdparty%2Fpdns.git auth: Convert DNSSECKeeper to SharedLockGuarded --- diff --git a/pdns/dbdnsseckeeper.cc b/pdns/dbdnsseckeeper.cc index 650580a53e..20e9d43d36 100644 --- a/pdns/dbdnsseckeeper.cc +++ b/pdns/dbdnsseckeeper.cc @@ -46,11 +46,9 @@ using namespace boost::assign; #include "namespaces.hh" -DNSSECKeeper::keycache_t DNSSECKeeper::s_keycache; -DNSSECKeeper::metacache_t DNSSECKeeper::s_metacache; +SharedLockGuarded DNSSECKeeper::s_keycache; +SharedLockGuarded DNSSECKeeper::s_metacache; int64_t DNSSECKeeper::s_metaCacheCleanActions = 0; -ReadWriteLock DNSSECKeeper::s_metacachelock; -ReadWriteLock DNSSECKeeper::s_keycachelock; AtomicCounter DNSSECKeeper::s_ops; time_t DNSSECKeeper::s_last_prune; size_t DNSSECKeeper::s_maxEntries = 0; @@ -119,26 +117,20 @@ bool DNSSECKeeper::addKey(const DNSName& name, bool setSEPBit, int algorithm, in } void DNSSECKeeper::clearAllCaches() { - { - WriteLock l(&s_keycachelock); - s_keycache.clear(); - } - WriteLock l(&s_metacachelock); - s_metacache.clear(); + s_keycache.write_lock()->clear(); + s_metacache.write_lock()->clear(); } bool DNSSECKeeper::clearKeyCache(const DNSName& name) { - WriteLock l(&s_keycachelock); - s_keycache.erase(name); + s_keycache.write_lock()->erase(name); return true; } bool DNSSECKeeper::clearMetaCache(const DNSName& name) { - WriteLock l(&s_metacachelock); - s_metacache.erase(name); + s_metacache.write_lock()->erase(name); ++s_metaCacheCleanActions; return true; } @@ -244,9 +236,9 @@ bool DNSSECKeeper::getFromMeta(const DNSName& zname, const std::string& key, std METAValues meta; if (ttl) { - ReadLock l(&s_metacachelock); - auto iter = s_metacache.find(zname); - if(iter != s_metacache.end() && iter->d_ttd > now) { + auto metacache = s_metacache.read_lock(); + auto iter = metacache->find(zname); + if(iter != metacache->end() && iter->d_ttd > now) { meta = iter->d_value; fromCache = true; } @@ -273,11 +265,11 @@ bool DNSSECKeeper::getFromMeta(const DNSName& zname, const std::string& key, std nce.d_ttd = now + ttl; nce.d_value = std::move(meta); { - WriteLock l(&s_metacachelock); + auto metacache = s_metacache.write_lock(); if(d_metaCacheCleanAction != s_metaCacheCleanActions) { return false; } - lruReplacingInsert(s_metacache, nce); + lruReplacingInsert(*metacache, nce); } } @@ -321,12 +313,10 @@ void DNSSECKeeper::getSoaEdit(const DNSName& zname, std::string& value, bool use uint64_t DNSSECKeeper::dbdnssecCacheSizes(const std::string& str) { if(str=="meta-cache-size") { - ReadLock l(&s_metacachelock); - return s_metacache.size(); + return s_metacache.read_lock()->size(); } else if(str=="key-cache-size") { - ReadLock l(&s_keycachelock); - return s_keycache.size(); + return s_keycache.read_lock()->size(); } return (uint64_t)-1; } @@ -553,10 +543,10 @@ DNSSECKeeper::keyset_t DNSSECKeeper::getKeys(const DNSName& zone, bool useCache) } if (useCache && ttl > 0) { - ReadLock l(&s_keycachelock); - keycache_t::const_iterator iter = s_keycache.find(zone); + auto keycache = s_keycache.read_lock(); + auto iter = keycache->find(zone); - if(iter != s_keycache.end() && iter->d_ttd > now) { + if (iter != keycache->end() && iter->d_ttd > now) { keyset_t ret; ret.reserve(iter->d_keys.size()); for(const keyset_t::value_type& value : iter->d_keys) @@ -623,8 +613,7 @@ DNSSECKeeper::keyset_t DNSSECKeeper::getKeys(const DNSName& zone, bool useCache) kce.d_keys = retkeyset; kce.d_ttd = now + ttl; { - WriteLock l(&s_keycachelock); - lruReplacingInsert(s_keycache, kce); + lruReplacingInsert(*(s_keycache.write_lock()), kce); } } @@ -978,12 +967,10 @@ void DNSSECKeeper::cleanup() if(now.tv_sec - s_last_prune > (time_t)(30)) { { - WriteLock l(&s_metacachelock); - pruneCollection(*this, s_metacache, s_maxEntries); + pruneCollection(*this, (*s_metacache.write_lock()), s_maxEntries); } { - WriteLock l(&s_keycachelock); - pruneCollection(*this, s_keycache, s_maxEntries); + pruneCollection(*this, (*s_keycache.write_lock()), s_maxEntries); } s_last_prune = time(nullptr); } @@ -993,7 +980,6 @@ void DNSSECKeeper::setMaxEntries(size_t maxEntries) { s_maxEntries = maxEntries; #if BOOST_VERSION >= 105600 - WriteLock wl(&s_keycachelock); - s_keycache.get().reserve(s_maxEntries); + s_keycache.write_lock()->get().reserve(s_maxEntries); #endif /* BOOST_VERSION >= 105600 */ } diff --git a/pdns/dnsseckeeper.hh b/pdns/dnsseckeeper.hh index edae2152f7..29f2fd0cbb 100644 --- a/pdns/dnsseckeeper.hh +++ b/pdns/dnsseckeeper.hh @@ -296,11 +296,9 @@ private: void cleanup(); - static keycache_t s_keycache; - static metacache_t s_metacache; + static SharedLockGuarded s_keycache; + static SharedLockGuarded s_metacache; static int64_t s_metaCacheCleanActions; - static ReadWriteLock s_metacachelock; - static ReadWriteLock s_keycachelock; static AtomicCounter s_ops; static time_t s_last_prune; static size_t s_maxEntries;