From: Miod Vallat Date: Mon, 29 Sep 2025 13:55:49 +0000 (+0200) Subject: Be more careful when initializing TransientDomainInfo. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F16196%2Fhead;p=thirdparty%2Fpdns.git Be more careful when initializing TransientDomainInfo. Signed-off-by: Miod Vallat (cherry picked from commit b6276dbf3297665b75cf0e4e342ad257a2f0b0e1) --- diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 7bd1b956d..7d0d3f79e 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -1055,13 +1055,14 @@ bool LMDBBackend::findDomain(uint32_t domainid, DomainInfo& info) const void LMDBBackend::consolidateDomainInfo(DomainInfo& info) const { - // Update the notified_serial value if we have a cached value in memory. + // Update the DomainInfo values if we have cached data in memory. if (!d_write_notification_update) { auto container = s_transient_domain_info.read_lock(); TransientDomainInfo tdi; - container->get(info.id, tdi); - info.notified_serial = tdi.notified_serial; - info.last_check = tdi.last_check; + if (container->get(info.id, tdi)) { + info.notified_serial = tdi.notified_serial; + info.last_check = tdi.last_check; + } } } @@ -1070,11 +1071,12 @@ void LMDBBackend::writeDomainInfo(const DomainInfo& info) if (!d_write_notification_update) { auto container = s_transient_domain_info.write_lock(); TransientDomainInfo tdi; - 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 && tdi.last_check == info.last_check) { - container->remove(info.id); + if (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 && tdi.last_check == info.last_check) { + container->remove(info.id); + } } } auto txn = d_tdomains->getRWTransaction(); @@ -1868,7 +1870,10 @@ void LMDBBackend::setLastCheckTime(uint32_t domain_id, time_t last_check) if (findDomain(domain_id, info)) { auto container = s_transient_domain_info.write_lock(); TransientDomainInfo tdi; - container->get(info.id, tdi); + if (!container->get(info.id, tdi)) { + // No data yet, initialize from DomainInfo + tdi.notified_serial = info.notified_serial; + } tdi.last_check = last_check; container->update(info.id, tdi); } @@ -1916,7 +1921,10 @@ 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; - container->get(info.id, tdi); + if (!container->get(info.id, tdi)) { + // No data yet, initialize from DomainInfo + tdi.last_check = info.last_check; + } tdi.notified_serial = serial; container->update(info.id, tdi); }