]> granicus.if.org Git - pdns/commitdiff
Fix ECS-based cache entry refresh code
authorbert hubert <bert.hubert@netherlabs.nl>
Wed, 31 Jan 2018 15:59:03 +0000 (16:59 +0100)
committerbert hubert <bert.hubert@netherlabs.nl>
Thu, 22 Feb 2018 19:10:40 +0000 (20:10 +0100)
This would lead to us not refreshing ECS-varying answers in the cache, and therefore an even more depressed cache rate.

Thanks to @liordot who found the issue & provided a fix in #6241.

pdns/recursor_cache.cc

index d3245420fb1d81014a0278fa25a6998fe1862714..ea9a4612f542f701045344f807f4312452a9f1a3 100644 (file)
@@ -93,7 +93,6 @@ MemRecursorCache::cache_t::const_iterator MemRecursorCache::getEntryUsingECSInde
         /* we have nothing more specific for you */
         break;
       }
-
       auto key = boost::make_tuple(qname, qtype, best);
       auto entry = d_cache.find(key);
       if (entry == d_cache.end()) {
@@ -264,23 +263,23 @@ bool MemRecursorCache::attemptToRefreshNSTTL(const QType& qt, const vector<DNSRe
 void MemRecursorCache::replace(time_t now, const DNSName &qname, const QType& qt, const vector<DNSRecord>& content, const vector<shared_ptr<RRSIGRecordContent>>& signatures, const std::vector<std::shared_ptr<DNSRecord>>& authorityRecs, bool auth, boost::optional<Netmask> ednsmask, vState state)
 {
   d_cachecachevalid = false;
-
+  //  cerr<<"Replacing "<<qname<<" for "<< (ednsmask ? ednsmask->toString() : "everyone") << endl;
   auto key = boost::make_tuple(qname, qt.getCode(), ednsmask ? *ednsmask : Netmask());
   bool isNew = false;
   cache_t::iterator stored = d_cache.find(key);
   if (stored == d_cache.end()) {
     stored = d_cache.insert(CacheEntry(key, CacheEntry::records_t(), auth)).first;
     isNew = true;
+  }
 
-    /* don't bother building an ecsIndex if we don't have any netmask-specific entries */
-    if (ednsmask && !ednsmask->empty()) {
-      auto ecsIndexKey = boost::make_tuple(qname, qt.getCode());
-      auto ecsIndex = d_ecsIndex.find(ecsIndexKey);
-      if (ecsIndex == d_ecsIndex.end()) {
-        ecsIndex = d_ecsIndex.insert(ECSIndexEntry(qname, qt.getCode())).first;
-      }
-      ecsIndex->addMask(*ednsmask);
+  /* don't bother building an ecsIndex if we don't have any netmask-specific entries */
+  if (ednsmask && !ednsmask->empty()) {
+    auto ecsIndexKey = boost::make_tuple(qname, qt.getCode());
+    auto ecsIndex = d_ecsIndex.find(ecsIndexKey);
+    if (ecsIndex == d_ecsIndex.end()) {
+      ecsIndex = d_ecsIndex.insert(ECSIndexEntry(qname, qt.getCode())).first;
     }
+    ecsIndex->addMask(*ednsmask);
   }
 
   time_t maxTTD=std::numeric_limits<time_t>::max();