]> 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>
Thu, 23 Oct 2025 09:14:56 +0000 (11:14 +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 c14d1601d3b99e85af8971d3b204bef05bdd1805..47cf4bc53e435fab2959f26421f93b35c8ae2382 100644 (file)
@@ -142,7 +142,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 a0c53f995048e47debc8468bb50846d4117b552a..30bec70def7355d625c14c4089931ba0b08cddf7 100644 (file)
@@ -1192,6 +1192,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;
   }
 }
 
@@ -1203,7 +1204,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);
     }
   }
@@ -2272,16 +2273,31 @@ void LMDBBackend::getUnfreshSecondaryInfos(vector<DomainInfo>* domains)
 
 void LMDBBackend::setStale(domainid_t domain_id)
 {
-  genChangeDomain(domain_id, [](DomainInfo& di) {
-    di.last_check = 0;
-  });
+  setLastCheckTime(domain_id, 0);
 }
 
 void LMDBBackend::setFresh(domainid_t domain_id)
 {
-  genChangeDomain(domain_id, [](DomainInfo& di) {
-    di.last_check = time(nullptr);
-  });
+  setLastCheckTime(domain_id, time(nullptr));
+}
+
+void LMDBBackend::setLastCheckTime(domainid_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)
@@ -2326,8 +2342,7 @@ void LMDBBackend::setNotified(domainid_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 46cb1a19266b996ba62efcfe944fc0a4f71c2d7f..f7cf912cecb889d45854cae69f85c1ef3fa49685 100644 (file)
@@ -342,6 +342,8 @@ private:
   void consolidateDomainInfo(DomainInfo& info) const;
   void writeDomainInfo(const DomainInfo& info);
 
+  void setLastCheckTime(domainid_t domain_id, time_t last_check);
+
   void getAllDomainsFiltered(vector<DomainInfo>* domains, const std::function<bool(DomainInfo&)>& allow);
 
   void lookupStart(domainid_t domain_id, const std::string& match, bool dolog);
@@ -360,6 +362,7 @@ private:
   // database.
   struct TransientDomainInfo
   {
+    time_t last_check{};
     uint32_t notified_serial{};
   };
   // Cache of DomainInfo notified_serial values