]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Handle freshness check timestamps similarly to notified serials.
authorMiod Vallat <miod.vallat@powerdns.com>
Mon, 29 Sep 2025 12:33:02 +0000 (14:33 +0200)
committerMiod Vallat <miod.vallat@powerdns.com>
Mon, 29 Sep 2025 15:20:23 +0000 (17:20 +0200)
Signed-off-by: Miod Vallat <miod.vallat@powerdns.com>
(cherry picked from commit dc22b370d4af51e3dede9a50d9677854e7f58fe1)

docs/backends/lmdb.rst
modules/lmdbbackend/lmdbbackend.cc
modules/lmdbbackend/lmdbbackend.hh

index 1e47370570a1b16ab6b79906a284972ce8648d81..a30a928f7f8e8db9144c6ad387c558b06c1c3c19 100644 (file)
@@ -138,7 +138,7 @@ Only enable this if you are using Lightning Stream.
 -  Default: yes
 
 Always update the domains table in the database when the last notification
-timestamp is modified.
+or the freshness check timestamp are modified.
 If disabled, these timestamps will only be written back to the database when
 other changes to the domain (such as accounts) occur.
 
index 5e945ab76ccb12d459bcd82e460c2af278637181..7bd1b956d4f283d295f5e6ff5d84823cfba3a4ff 100644 (file)
@@ -1061,6 +1061,7 @@ void LMDBBackend::consolidateDomainInfo(DomainInfo& info) const
     TransientDomainInfo tdi;
     container->get(info.id, tdi);
     info.notified_serial = tdi.notified_serial;
+    info.last_check = tdi.last_check;
   }
 }
 
@@ -1072,7 +1073,7 @@ void LMDBBackend::writeDomainInfo(const DomainInfo& info)
     container->get(info.id, tdi);
     // Only remove the in-memory value if it has not been modified since the
     // DomainInfo data was set up.
-    if (tdi.notified_serial == info.notified_serial) {
+    if (tdi.notified_serial == info.notified_serial && tdi.last_check == info.last_check) {
       container->remove(info.id);
     }
   }
@@ -1846,16 +1847,31 @@ void LMDBBackend::getUnfreshSecondaryInfos(vector<DomainInfo>* domains)
 
 void LMDBBackend::setStale(uint32_t domain_id)
 {
-  genChangeDomain(domain_id, [](DomainInfo& di) {
-    di.last_check = 0;
-  });
+  setLastCheckTime(domain_id, 0);
 }
 
 void LMDBBackend::setFresh(uint32_t domain_id)
 {
-  genChangeDomain(domain_id, [](DomainInfo& di) {
-    di.last_check = time(nullptr);
-  });
+  setLastCheckTime(domain_id, time(nullptr));
+}
+
+void LMDBBackend::setLastCheckTime(uint32_t domain_id, time_t last_check)
+{
+  if (d_write_notification_update) {
+    genChangeDomain(domain_id, [last_check](DomainInfo& info) {
+      info.last_check = last_check;
+    });
+    return;
+  }
+
+  DomainInfo info;
+  if (findDomain(domain_id, info)) {
+    auto container = s_transient_domain_info.write_lock();
+    TransientDomainInfo tdi;
+    container->get(info.id, tdi);
+    tdi.last_check = last_check;
+    container->update(info.id, tdi);
+  }
 }
 
 void LMDBBackend::getUpdatedPrimaries(vector<DomainInfo>& updatedDomains, std::unordered_set<DNSName>& catalogs, CatalogHashMap& catalogHashes)
@@ -1900,8 +1916,7 @@ void LMDBBackend::setNotified(uint32_t domain_id, uint32_t serial)
   if (findDomain(domain_id, info)) {
     auto container = s_transient_domain_info.write_lock();
     TransientDomainInfo tdi;
-    // will need container->get(info.id, tdi); once TransientDomainInfo grows
-    // more fields.
+    container->get(info.id, tdi);
     tdi.notified_serial = serial;
     container->update(info.id, tdi);
   }
index 4a0fcbd2d0aa90034fa8263b90091285b51fef6d..4cbafef8e9877c619e977f6a4cd7b7035633fe49 100644 (file)
@@ -315,6 +315,8 @@ private:
   void consolidateDomainInfo(DomainInfo& info) const;
   void writeDomainInfo(const DomainInfo& info);
 
+  void setLastCheckTime(uint32_t domain_id, time_t last_check);
+
   void getAllDomainsFiltered(vector<DomainInfo>* domains, const std::function<bool(DomainInfo&)>& allow);
 
   bool getSerial(DomainInfo& di);
@@ -330,6 +332,7 @@ private:
   // database.
   struct TransientDomainInfo
   {
+    time_t last_check{};
     uint32_t notified_serial{};
   };
   // Cache of DomainInfo notified_serial values