]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Better way for pruning if cleaning dead entries wasn't enough
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 11 Dec 2019 13:01:59 +0000 (14:01 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 4 Mar 2020 09:27:19 +0000 (10:27 +0100)
pdns/cachecleaner.hh
pdns/recursor_cache.cc

index a29533c20e407c1f59e4d4e2717529e11fc6abe3..c66e430bb441030d1eacc253190f8f5de638e6be 100644 (file)
@@ -204,20 +204,23 @@ template <typename S, typename C, typename T> uint64_t pruneMutexCollectionsVect
 
   toTrim -= totErased;
 
-  // XXXX kinda desperate method
   while (toTrim > 0) {
+    size_t pershard = toTrim / maps_size + 1;
     for (auto& mc : maps) {
       const std::lock_guard<std::mutex> lock(mc.mutex);
       mc.d_cachecachevalid = false;
       auto& sidx = boost::multi_index::get<S>(mc.d_map);
-      auto i = sidx.begin();
-      container.preRemoval(*i);
-      i = sidx.erase(i);
-      mc.d_entriesCount--;
-      totErased++;
-      toTrim--;
-      if (toTrim == 0)
-        break;
+      size_t removed = 0;
+      for (auto i = sidx.begin(); i != sidx.end() && removed < pershard; removed++) {
+        container.preRemoval(*i);
+        i = sidx.erase(i);
+        mc.d_entriesCount--;
+        totErased++;
+        toTrim--;
+        if (toTrim == 0) {
+          break;
+        }
+      }
     }
   }
   return totErased;
index 3464b7f756b6b1f1cf45c39ee5d7b1e56fae29ef..4ceb1a1f7e9336ea54a614089f379a52824b0f4f 100644 (file)
@@ -33,7 +33,6 @@ MemRecursorCache::~MemRecursorCache()
 
 size_t MemRecursorCache::size()
 {
-  // XXX!
   size_t count = 0;
   for (auto& map : d_maps) {
     count += map.d_entriesCount;