From d70a762725cd7011b15286eb580ad93c932b7641 Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Mon, 10 Feb 2020 14:31:41 +0100 Subject: [PATCH] Introduce an explicit refreshFromConf arg to RPZIXFRTracker. Always load and store the rpz refresh value from and to the zone. That we we can easily decide which value to use: if an explicit refreshFromConf value is set, use that one, otherwise use the one in the rpz zone. --- pdns/rec-lua-conf.cc | 5 ++--- pdns/rec-lua-conf.hh | 2 +- pdns/rpzloader.cc | 27 ++++++++++++++------------- pdns/rpzloader.hh | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pdns/rec-lua-conf.cc b/pdns/rec-lua-conf.cc index 339ea604f5..aae001107a 100644 --- a/pdns/rec-lua-conf.cc +++ b/pdns/rec-lua-conf.cc @@ -335,7 +335,6 @@ void loadRecursorLuaConfig(const std::string& fname, luaConfigDelayedThreads& de DNSName domain(zoneName); zone->setDomain(domain); zone->setName(polName); - zone->setRefresh(refresh); zoneIdx = lci.dfe.addZone(zone); if (!seedFile.empty()) { @@ -365,7 +364,7 @@ void loadRecursorLuaConfig(const std::string& fname, luaConfigDelayedThreads& de exit(1); // FIXME proper exit code? } - delayedThreads.rpzMasterThreads.push_back(std::make_tuple(masters, defpol, defpolOverrideLocal, maxTTL, zoneIdx, tt, maxReceivedXFRMBytes, localAddress, axfrTimeout, sr, dumpFile)); + delayedThreads.rpzMasterThreads.push_back(std::make_tuple(masters, defpol, defpolOverrideLocal, maxTTL, zoneIdx, tt, maxReceivedXFRMBytes, localAddress, axfrTimeout, refresh, sr, dumpFile)); }); typedef vector > > > > argvec_t; @@ -598,7 +597,7 @@ void startLuaConfigDelayedThreads(const luaConfigDelayedThreads& delayedThreads, { for (const auto& rpzMaster : delayedThreads.rpzMasterThreads) { try { - std::thread t(RPZIXFRTracker, std::get<0>(rpzMaster), std::get<1>(rpzMaster), std::get<2>(rpzMaster), std::get<3>(rpzMaster), std::get<4>(rpzMaster), std::get<5>(rpzMaster), std::get<6>(rpzMaster) * 1024 * 1024, std::get<7>(rpzMaster), std::get<8>(rpzMaster), std::get<9>(rpzMaster), std::get<10>(rpzMaster), generation); + std::thread t(RPZIXFRTracker, std::get<0>(rpzMaster), std::get<1>(rpzMaster), std::get<2>(rpzMaster), std::get<3>(rpzMaster), std::get<4>(rpzMaster), std::get<5>(rpzMaster), std::get<6>(rpzMaster) * 1024 * 1024, std::get<7>(rpzMaster), std::get<8>(rpzMaster), std::get<9>(rpzMaster), std::get<10>(rpzMaster), std::get<11>(rpzMaster), generation); t.detach(); } catch(const std::exception& e) { diff --git a/pdns/rec-lua-conf.hh b/pdns/rec-lua-conf.hh index 1cd2e62046..0ffff69c01 100644 --- a/pdns/rec-lua-conf.hh +++ b/pdns/rec-lua-conf.hh @@ -85,7 +85,7 @@ extern GlobalStateHolder g_luaconfs; struct luaConfigDelayedThreads { - std::vector, boost::optional, bool, uint32_t, size_t, TSIGTriplet, size_t, ComboAddress, uint16_t, std::shared_ptr, std::string> > rpzMasterThreads; + std::vector, boost::optional, bool, uint32_t, size_t, TSIGTriplet, size_t, ComboAddress, uint16_t, uint32_t, std::shared_ptr, std::string> > rpzMasterThreads; }; void loadRecursorLuaConfig(const std::string& fname, luaConfigDelayedThreads& delayedThreads); diff --git a/pdns/rpzloader.cc b/pdns/rpzloader.cc index 6a7b7a0603..4159b1e5eb 100644 --- a/pdns/rpzloader.cc +++ b/pdns/rpzloader.cc @@ -262,7 +262,9 @@ std::shared_ptr loadRPZFromFile(const std::string& fname, std: } } - zone->setRefresh(sr->d_st.refresh); + if (sr != nullptr) { + zone->setRefresh(sr->d_st.refresh); + } return sr; } @@ -347,18 +349,20 @@ static bool dumpZoneToDisk(const DNSName& zoneName, const std::shared_ptr& masters, boost::optional defpol, bool defpolOverrideLocal, uint32_t maxTTL, size_t zoneIdx, const TSIGTriplet& tt, size_t maxReceivedBytes, const ComboAddress& localAddress, const uint16_t axfrTimeout, std::shared_ptr sr, std::string dumpZoneFileName, uint64_t configGeneration) +void RPZIXFRTracker(const std::vector& masters, boost::optional defpol, bool defpolOverrideLocal, uint32_t maxTTL, size_t zoneIdx, const TSIGTriplet& tt, size_t maxReceivedBytes, const ComboAddress& localAddress, const uint16_t axfrTimeout, const uint32_t refreshFromConf, std::shared_ptr sr, std::string dumpZoneFileName, uint64_t configGeneration) { setThreadName("pdns-r/RPZIXFR"); bool isPreloaded = sr != nullptr; auto luaconfsLocal = g_luaconfs.getLocal(); + /* we can _never_ modify this zone directly, we need to do a full copy then replace the existing zone */ std::shared_ptr oldZone = luaconfsLocal->dfe.getZone(zoneIdx); if (!oldZone) { g_log<getRefresh(); + + time_t refresh; DNSName zoneName = oldZone->getDomain(); std::string polName = oldZone->getName() ? *(oldZone->getName()) : zoneName.toString(); @@ -370,12 +374,10 @@ void RPZIXFRTracker(const std::vector& masters, boost::optionald_st.refresh; - } newZone->setSerial(sr->d_st.serial); newZone->setRefresh(sr->d_st.refresh); setRPZZoneNewState(polName, sr->d_st.serial, newZone->size(), true); + refresh = std::max(refreshFromConf ? refreshFromConf : newZone->getRefresh(), 10U); g_luaconfs.modify([zoneIdx, &newZone](LuaConfigItems& lci) { lci.dfe.setZone(zoneIdx, newZone); @@ -389,24 +391,21 @@ void RPZIXFRTracker(const std::vector& masters, boost::optional 0 ? refresh : 10)<<" seconds...)"< 0 ? refresh : 10)<<" seconds...)"<getRefresh(), 10U); bool skipRefreshDelay = isPreloaded; for(;;) { @@ -506,6 +505,7 @@ void RPZIXFRTracker(const std::vector& masters, boost::optionald_st.serial<setSerial(sr->d_st.serial); + newZone->setRefresh(sr->d_st.refresh); setRPZZoneNewState(polName, sr->d_st.serial, newZone->size(), fullUpdate); /* we need to replace the existing zone with the new one, @@ -519,5 +519,6 @@ void RPZIXFRTracker(const std::vector& masters, boost::optionalgetRefresh(), 10U); } } diff --git a/pdns/rpzloader.hh b/pdns/rpzloader.hh index 345a1e31ee..c11156f6dd 100644 --- a/pdns/rpzloader.hh +++ b/pdns/rpzloader.hh @@ -27,7 +27,7 @@ extern bool g_logRPZChanges; std::shared_ptr loadRPZFromFile(const std::string& fname, std::shared_ptr zone, boost::optional defpol, bool defpolOverrideLocal, uint32_t maxTTL); -void RPZIXFRTracker(const std::vector& masters, boost::optional defpol, bool defpolOverrideLocal, uint32_t maxTTL, size_t zoneIdx, const TSIGTriplet& tt, size_t maxReceivedBytes, const ComboAddress& localAddress, const uint16_t axfrTimeout, shared_ptr sr, std::string dumpZoneFileName, uint64_t configGeneration); +void RPZIXFRTracker(const std::vector& masters, boost::optional defpol, bool defpolOverrideLocal, uint32_t maxTTL, size_t zoneIdx, const TSIGTriplet& tt, size_t maxReceivedBytes, const ComboAddress& localAddress, const uint16_t axfrTimeout, const uint32_t reloadFromConf, shared_ptr sr, std::string dumpZoneFileName, uint64_t configGeneration); struct rpzStats { -- 2.47.2