]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Use the level actually *used* to decide to update edns status.
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 3 May 2022 07:05:21 +0000 (09:05 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Fri, 17 Jun 2022 08:33:21 +0000 (10:33 +0200)
Fold the logic to not update if no change and updating the timestamp to the setter.

pdns/syncres.cc
pdns/syncres.hh

index 3bf06b4d4185a4891d99d345480d8d3ec76354de..5beb4d400e9b5c04c6a18c2f2ae3aed8a6ee92e9 100644 (file)
@@ -1077,14 +1077,11 @@ struct ednsstatus_t : public multi_index_container<SyncRes::EDNSStatus,
     ind.modify(it, [](SyncRes::EDNSStatus &s) { s.mode = SyncRes::EDNSStatus::EDNSMode::UNKNOWN; s.modeSetAt = 0; });
   }
 
-  void setMode(index<ComboAddress>::type &ind, iterator it, SyncRes::EDNSStatus::EDNSMode mode)
+  void setMode(index<ComboAddress>::type &ind, iterator it, SyncRes::EDNSStatus::EDNSMode mode, time_t ts)
   {
-    it->mode = mode;
-  }
-
-  void setTS(index<ComboAddress>::type &ind, iterator it, time_t ts)
-  {
-    ind.modify(it, [ts](SyncRes::EDNSStatus &s) { s.modeSetAt = ts; });
+    if (it->mode != mode || it->modeSetAt == 0) {
+      ind.modify(it, [=](SyncRes::EDNSStatus &s) { s.mode = mode; s.modeSetAt = ts; });
+    }
   }
 
   void prune(time_t cutoff)
@@ -1494,12 +1491,10 @@ LWResult::Result SyncRes::asyncresolveWrapper(const ComboAddress& ip, bool ednsM
     auto &ind = lock->get<ComboAddress>();
     if (ednsstatus->modeSetAt && ednsstatus->modeSetAt + 3600 < d_now.tv_sec) {
       lock->reset(ind, ednsstatus);
-      // cerr<<"Resetting EDNS Status for "<<ip.toString()<<endl);
     }
     mode = ednsstatus->mode;
   }
 
-  const SyncRes::EDNSStatus::EDNSMode oldmode = mode;
   int EDNSLevel = 0;
   auto luaconfsLocal = g_luaconfs.getLocal();
   ResolveContext ctx;
@@ -1511,7 +1506,7 @@ LWResult::Result SyncRes::asyncresolveWrapper(const ComboAddress& ip, bool ednsM
 
   LWResult::Result ret;
 
-  for (int tries = 0; tries < 3; ++tries) {
+  for (int tries = 0; tries < 2; ++tries) {
 
     if (mode == EDNSStatus::NOEDNS) {
       g_stats.noEdnsOutQueries++;
@@ -1541,37 +1536,27 @@ LWResult::Result SyncRes::asyncresolveWrapper(const ComboAddress& ip, bool ednsM
       break;
     }
 
-    // ret is LWResult::Result::Success
-    // ednsstatus might be cleared, so do a new lookup/insert
-    auto lock = s_ednsstatus.lock();
-    auto ednsstatus = lock->insert(ip).first;
-    mode = ednsstatus->mode;
-    auto &ind = lock->get<ComboAddress>();
+    if (EDNSLevel == 1) {
+      // We sent out with EDNS
+      // ret is LWResult::Result::Success
+      // ednsstatus in table might be pruned or changed by another request/thread, so do a new lookup/insert
+      auto lock = s_ednsstatus.lock();
+      auto ednsstatus = lock->insert(ip).first;
+      auto &ind = lock->get<ComboAddress>();
 
-    if (mode != EDNSStatus::NOEDNS) {
       if (res->d_validpacket && !res->d_haveEDNS && res->d_rcode == RCode::FormErr)  {
         mode = EDNSStatus::NOEDNS;
-        lock->setMode(ind, ednsstatus, mode);
+        lock->setMode(ind, ednsstatus, mode, d_now.tv_sec);
         continue;
       }
       else if (!res->d_haveEDNS) {
-        if (mode != EDNSStatus::EDNSIGNORANT) {
-          mode =  EDNSStatus::EDNSIGNORANT;
-          lock->setMode(ind, ednsstatus, mode);
-       }
+        lock->setMode(ind, ednsstatus, EDNSStatus::EDNSIGNORANT, d_now.tv_sec);
       }
       else {
-       if (mode != EDNSStatus::EDNSOK) {
-          mode = EDNSStatus::EDNSOK;
-          lock->setMode(ind, ednsstatus, mode);
-        }
+        lock->setMode(ind, ednsstatus, EDNSStatus::EDNSOK, d_now.tv_sec);
       }
     }
 
-    if (oldmode != mode || !ednsstatus->modeSetAt) {
-      lock->setTS(ind, ednsstatus, d_now.tv_sec);
-    }
-
     break;
   }
   return ret;
index b2ad364f43df591d4e0e5e67e407fe3b4d80b672..161ed219a17fa622cd12043bf0a019763fe993a4 100644 (file)
@@ -216,11 +216,11 @@ public:
     EDNSStatus(const ComboAddress &arg) : address(arg) {}
     ComboAddress address;
     time_t modeSetAt{0};
-    mutable enum EDNSMode : uint8_t { UNKNOWN = 0, EDNSOK = 1, EDNSIGNORANT = 2, NOEDNS = 3 } mode{UNKNOWN};
+    enum EDNSMode : uint8_t { UNKNOWN = 0, EDNSOK = 1, EDNSIGNORANT = 2, NOEDNS = 3 } mode{UNKNOWN};
 
     std::string toString() const
     {
-      const std::array<std::string,4> modes = { "Unknown", "OK", "Ignorant", "NoEDNS" };
+      const std::array<std::string,4> modes = { "Unknown", "OK", "Ignorant", "No" };
       unsigned int m = static_cast<unsigned int>(mode);
       if (m >= modes.size()) {
         return "?";