]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Remove the useless separate entries counter from the cache
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 2 Mar 2021 17:08:17 +0000 (18:08 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 2 Mar 2021 17:08:17 +0000 (18:08 +0100)
Getting the size of the map is a constant-time operation and should
be as accurate so let's just use that.

pdns/dnsdist-cache.cc
pdns/dnsdist-cache.hh

index d27636d7b6b7a5a7e5e1d3d97ec6b7a0d040f899..88128e246571e5d8872ed9deeb144d5c9cfc2c67 100644 (file)
@@ -105,7 +105,6 @@ void DNSDistPacketCache::insertLocked(CacheShard& shard, uint32_t key, CacheValu
   tie(it, result) = map.insert({key, newValue});
 
   if (result) {
-    shard.d_entriesCount++;
     return;
   }
 
@@ -165,7 +164,7 @@ void DNSDistPacketCache::insert(uint32_t key, const boost::optional<Netmask>& su
 
   uint32_t shardIndex = getShardIndex(key);
 
-  if (d_shards.at(shardIndex).d_entriesCount >= (d_maxEntries / d_shardCount)) {
+  if (d_shards.at(shardIndex).d_map.size() >= (d_maxEntries / d_shardCount)) {
     return;
   }
 
@@ -308,12 +307,12 @@ size_t DNSDistPacketCache::purgeExpired(size_t upTo, const time_t now)
     uint32_t shardIndex = (d_expungeIndex++ % d_shardCount);
 
     WriteLock w(&d_shards.at(shardIndex).d_lock);
-    if (d_shards.at(shardIndex).d_entriesCount <= maxPerShard) {
+    auto& map = d_shards.at(shardIndex).d_map;
+    if (map.size() <= maxPerShard) {
       continue;
     }
 
-    size_t toRemove = d_shards.at(shardIndex).d_entriesCount - maxPerShard;
-    auto& map = d_shards.at(shardIndex).d_map;
+    size_t toRemove = map.size() - maxPerShard;
 
     for (auto it = map.begin(); toRemove > 0 && it != map.end(); ) {
       const CacheValue& value = it->second;
@@ -321,7 +320,6 @@ size_t DNSDistPacketCache::purgeExpired(size_t upTo, const time_t now)
       if (value.validity <= now) {
         it = map.erase(it);
         --toRemove;
-        d_shards[shardIndex].d_entriesCount--;
         ++removed;
       } else {
         ++it;
@@ -362,13 +360,11 @@ size_t DNSDistPacketCache::expunge(size_t upTo)
     if (map.size() >= toRemove) {
       std::advance(endIt, toRemove);
       map.erase(beginIt, endIt);
-      shard.d_entriesCount -= toRemove;
       removed += toRemove;
     }
     else {
       removed += map.size();
       map.clear();
-      shard.d_entriesCount = 0;
     }
   }
 
@@ -388,7 +384,6 @@ size_t DNSDistPacketCache::expungeByName(const DNSName& name, uint16_t qtype, bo
 
       if ((value.qname == name || (suffixMatch && value.qname.isPartOf(name))) && (qtype == QType::ANY || qtype == value.qtype)) {
         it = map.erase(it);
-        d_shards[shardIndex].d_entriesCount--;
         ++removed;
       } else {
         ++it;
@@ -409,7 +404,7 @@ uint64_t DNSDistPacketCache::getSize()
   uint64_t count = 0;
 
   for (uint32_t shardIndex = 0; shardIndex < d_shardCount; shardIndex++) {
-    count += d_shards.at(shardIndex).d_entriesCount;
+    count += d_shards.at(shardIndex).d_map.size();
   }
 
   return count;
index c2441a631de66e53d2dfeaefd74ab819d5d06368..464217e3edeeee9926c48186b382e7ee70b16052 100644 (file)
@@ -104,10 +104,10 @@ private:
   class CacheShard
   {
   public:
-    CacheShard(): d_entriesCount(0)
+    CacheShard()
     {
     }
-    CacheShard(const CacheShard& old): d_entriesCount(0)
+    CacheShard(const CacheShard& old)
     {
     }
 
@@ -118,7 +118,6 @@ private:
 
     std::unordered_map<uint32_t,CacheValue> d_map;
     ReadWriteLock d_lock;
-    std::atomic<uint64_t> d_entriesCount;
   };
 
   bool cachedValueMatches(const CacheValue& cachedValue, uint16_t queryFlags, const DNSName& qname, uint16_t qtype, uint16_t qclass, bool tcp, bool dnssecOK, const boost::optional<Netmask>& subnet) const;