]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Avoid race setting serverID
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 13 Mar 2024 11:55:39 +0000 (12:55 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Mon, 25 Mar 2024 09:22:07 +0000 (10:22 +0100)
pdns/recursordist/rec-main.cc
pdns/recursordist/rec-system-resolve.cc
pdns/recursordist/rec-system-resolve.hh
pdns/recursordist/settings/rust/Cargo.toml
pdns/recursordist/test-rec-system-resolve.cc

index dd959baadf648293daa13beb0ac4146192151d7b..1013c482072e0521549d145b7379bf82cd294b04 100644 (file)
@@ -3202,7 +3202,8 @@ int main(int argc, char** argv)
     handleRuntimeDefaults(startupLog);
 
     if (auto ttl = ::arg().asNum("system-resolver-ttl"); ttl != 0) {
-      pdns::RecResolve::setInstanceParameters(ttl, []() { reloadZoneConfiguration(g_yamlSettings); });
+      // Cannot use SyncRes::s_serverID, it is nt set yet
+      pdns::RecResolve::setInstanceParameters(arg()["server-id"], ttl, []() { reloadZoneConfiguration(g_yamlSettings); });
     }
 
     g_recCache = std::make_unique<MemRecursorCache>(::arg().asNum("record-cache-shards"));
index 9d32813381dcd728b939585c942b4b84e5b8bfe7..a77f689fac0ff441aa363f223ffb5af8fe69ec5d 100644 (file)
@@ -32,7 +32,6 @@
 #include "logging.hh"
 #include "noinitvector.hh"
 #include "threadname.hh"
-#include "syncres.hh"
 
 namespace
 {
@@ -91,11 +90,13 @@ std::string serverID()
 }
 } // anonymous namespace
 
-std::function<void()> pdns::RecResolve::s_callback;
+std::string pdns::RecResolve::s_serverID;
 time_t pdns::RecResolve::s_ttl{0};
+std::function<void()> pdns::RecResolve::s_callback;
 
-void pdns::RecResolve::setInstanceParameters(time_t ttl, const std::function<void()>& callback)
+void pdns::RecResolve::setInstanceParameters(std::string serverID, time_t ttl, const std::function<void()>& callback)
 {
+  pdns::RecResolve::s_serverID = std::move(serverID);
   pdns::RecResolve::s_ttl = ttl;
   pdns::RecResolve::s_callback = callback;
 }
@@ -250,9 +251,9 @@ void pdns::RecResolve::Refresher::refreshLoop()
       if (lastSelfCheck < time(nullptr) - 3600) {
         lastSelfCheck = time(nullptr);
         auto resolvedServerID = serverID();
-        if (resolvedServerID == SyncRes::s_serverID) {
+        if (resolvedServerID == s_serverID) {
           auto log = g_slog->withName("system-resolver");
-          log->info(Logr::Error, "id.server/CH/TXT resolves to my own server identidy", "id.server", Logging::Loggable(resolvedServerID));
+          log->info(Logr::Error, "id.server/CH/TXT resolves to my own server identity", "id.server", Logging::Loggable(resolvedServerID));
         }
       }
       changes = d_resolver.refresh(time(nullptr));
index f20af5a56f5720603ae47a5dc5a9bfbca07b9f8a..4268fa925b8d9a2c5f63576f6ea782448ec3bd18 100644 (file)
@@ -38,7 +38,7 @@ class RecResolve
 {
 public:
   // Should be called before any getInstance() call is done
-  static void setInstanceParameters(time_t ttl, const std::function<void()>& callback);
+  static void setInstanceParameters(std::string serverID, time_t ttl, const std::function<void()>& callback);
   static RecResolve& getInstance();
 
   RecResolve(time_t ttl = 60, const std::function<void()>& callback = nullptr);
@@ -95,6 +95,7 @@ private:
 
   Refresher d_refresher;
 
+  static std::string s_serverID;
   static std::function<void()> s_callback;
   static time_t s_ttl;
 };
index 80ab080e98f5393de20f0080c263896d8749efa6..b635af385c1685062f471b07d7c8ba07d5b1a8fc 100644 (file)
@@ -13,7 +13,7 @@ serde = { version = "1.0", features = ["derive"] }
 serde_yaml = "0.9"
 ipnet = "2.8"
 once_cell = "1.18.0"
-hostname-validator = "1.1.1"
+hostname-validator = "1.1.1" # This is temporary. PR 13819 has the infra to call C++ from, so we can arrange for DNSName::ishostname() to be called instead of importing another crate aftyer that one is merged.
 
 [build-dependencies]
 cxx-build = "1.0"
index 82707d6dc8d4df5d7b665c8d34951524330f8be4..7c559b6706d0696977ff59906e8a83b6b5c41fad 100644 (file)
@@ -11,7 +11,7 @@ BOOST_AUTO_TEST_SUITE(rec_system_resolve)
 BOOST_AUTO_TEST_CASE(test_basic_resolve)
 {
 
-  pdns::RecResolve::setInstanceParameters(60, nullptr);
+  pdns::RecResolve::setInstanceParameters("foo", 60, nullptr);
   auto& sysResolve = pdns::RecResolve::getInstance();
 
   auto address = sysResolve.lookupAndRegister("localhost", time(nullptr));