From: Miod Vallat Date: Thu, 10 Jul 2025 06:46:58 +0000 (+0200) Subject: Shuffle/factor internal query logic in preparation for future changes, NFCI X-Git-Tag: rec-5.4.0-alpha0~34^2~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=193755bd0651d0cf271f080e2d5ac60a79ea335c;p=thirdparty%2Fpdns.git Shuffle/factor internal query logic in preparation for future changes, NFCI Signed-off-by: Miod Vallat --- diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 7e779534b4..0501902ab0 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -1736,22 +1736,10 @@ bool LMDBBackend::list(const ZoneName& target, domainid_t domain_id, bool includ d_lookupdomain = target; d_includedisabled = include_disabled; - d_rotxn = getRecordsROTransaction(domain_id, d_rwtxn); - d_txnorder = true; - d_getcursor = std::make_shared(d_rotxn->txn->getCursor(d_rotxn->db->dbi)); - - compoundOrdername co; // NOLINT(readability-identifier-length) - std::string match = co(domain_id); - - MDBOutVal key, val; - if (d_getcursor->prefix(match, key, val) != 0) { - d_getcursor.reset(); - } - - // Make sure we start with fresh data - d_currentrrset.clear(); - d_currentrrsetpos = 0; + compoundOrdername order; + std::string match = order(domain_id); + lookupStart(domain_id, match, false); return true; } @@ -1762,67 +1750,72 @@ void LMDBBackend::lookupInternal(const QType& type, const DNSName& qdomain, doma d_dtime.set(); } - d_includedisabled = include_disabled; - - ZoneName hunt(qdomain); - DomainInfo di; + DomainInfo info; if (zoneId == UnknownDomainID) { + ZoneName hunt(qdomain); auto rotxn = d_tdomains->getROTransaction(); do { - zoneId = rotxn.get<0>(hunt, di); - } while (zoneId == 0 && type != QType::SOA && hunt.chopOff()); - if (zoneId == 0) { + info.id = static_cast(rotxn.get<0>(hunt, info)); + } while (info.id == 0 && type != QType::SOA && hunt.chopOff()); + if (info.id == 0) { // cout << "Did not find zone for "<< qdomain<getROTransaction().get(zoneId, di)) { + if (!d_tdomains->getROTransaction().get(zoneId, info)) { // cout<<"Could not find a zone with id "<(d_rotxn->txn->getCursor(d_rotxn->db->dbi)); - MDBOutVal key, val; + d_lookupdomain = std::move(info.zone); + d_includedisabled = include_disabled; + + compoundOrdername order; std::string match; if (type.getCode() == QType::ANY) { - match = co(zoneId, relqname); + match = order(info.id, relqname); } else { - match = co(zoneId, relqname, type.getCode()); + match = order(info.id, relqname, type.getCode()); } + lookupStart(info.id, match, d_dolog); +} + +void LMDBBackend::lookupStart(domainid_t domain_id, const std::string& match, bool dolog) +{ + d_rotxn = getRecordsROTransaction(domain_id, d_rwtxn); + d_txnorder = true; + d_getcursor = std::make_shared(d_rotxn->txn->getCursor(d_rotxn->db->dbi)); + + // Make sure we start with fresh data + d_currentrrset.clear(); + d_currentrrsetpos = 0; + + MDBOutVal key, val; if (d_getcursor->prefix(match, key, val) != 0) { - d_getcursor.reset(); - if (d_dolog) { + d_getcursor.reset(); // will cause get() to fail + if (dolog) { g_log << Logger::Warning << "Query " << ((long)(void*)this) << ": " << d_dtime.udiffNoReset() << " us to execute (found nothing)" << endl; } return; } - if (d_dolog) { + if (dolog) { g_log << Logger::Warning << "Query " << ((long)(void*)this) << ": " << d_dtime.udiffNoReset() << " us to execute" << endl; } - - d_lookupdomain = std::move(hunt); - - // Make sure we start with fresh data - d_currentrrset.clear(); - d_currentrrsetpos = 0; } bool LMDBBackend::get(DNSZoneRecord& zr) diff --git a/modules/lmdbbackend/lmdbbackend.hh b/modules/lmdbbackend/lmdbbackend.hh index c01f292e32..94c535d96d 100644 --- a/modules/lmdbbackend/lmdbbackend.hh +++ b/modules/lmdbbackend/lmdbbackend.hh @@ -337,6 +337,7 @@ private: void getAllDomainsFiltered(vector* domains, const std::function& allow); + void lookupStart(domainid_t domain_id, const std::string& match, bool dolog); void lookupInternal(const QType& type, const DNSName& qdomain, domainid_t zoneId, DNSPacket* p, bool include_disabled); bool getSerial(DomainInfo& di);