]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Try and build fewer ZoneName objects whenever possible.
authorMiod Vallat <miod.vallat@powerdns.com>
Mon, 5 May 2025 13:35:06 +0000 (15:35 +0200)
committerMiod Vallat <miod.vallat@powerdns.com>
Mon, 26 May 2025 11:49:13 +0000 (13:49 +0200)
pdns/auth-primarycommunicator.cc
pdns/dnsbackend.cc
pdns/ixfrdist.cc
pdns/serialtweaker.cc
pdns/tcpreceiver.cc
pdns/test-ueberbackend_cc.cc
pdns/ueberbackend.cc
pdns/ws-api.cc
pdns/ws-api.hh
pdns/ws-auth.cc

index b45e6e06dbefb0ba55ec8fa0264a78caab4f43dd..2768b6f2f0bb5720281ff56ed55a273714ae6086 100644 (file)
@@ -169,10 +169,10 @@ void CommunicatorClass::getUpdatedProducers(UeberBackend* B, vector<DomainInfo>&
 
         DNSResourceRecord rr;
         makeIncreasedSOARecord(sd, "EPOCH", "", rr);
-        di.backend->startTransaction(ZoneName(sd.qname), UnknownDomainID);
+        di.backend->startTransaction(sd.zonename, UnknownDomainID);
         if (!di.backend->replaceRRSet(di.id, rr.qname, rr.qtype, vector<DNSResourceRecord>(1, rr))) {
           di.backend->abortTransaction();
-          throw PDNSException("backend hosting producer zone '" + sd.qname.toLogString() + "' does not support editing records");
+          throw PDNSException("backend hosting producer zone '" + sd.zonename.toLogString() + "' does not support editing records");
         }
         di.backend->commitTransaction();
 
index 68a00ef4f26eed699efa94cf5ae0f128dd8b19dd..32145772f3fa28b5c210e7bcb0fb557cdb9af31b 100644 (file)
@@ -273,8 +273,8 @@ bool DNSBackend::getSOA(const ZoneName& domain, domainid_t zoneId, SOAData& soaD
         throw PDNSException("Got non-SOA record when asking for SOA, zone: '" + domain.toLogString() + "'");
       }
       hits++;
-      soaData.qname = domain.operator const DNSName&().makeLowerCase();
       soaData.zonename = domain.makeLowerCase();
+      soaData.qname = soaData.zonename.operator const DNSName&();
       soaData.ttl = resourceRecord.ttl;
       soaData.db = this;
       soaData.domain_id = resourceRecord.domain_id;
index c2d83c6d1b03f1977e6bad450ded66901bf819ca..91f4e8fd94e5b8713621232da205b1cc8fa87a8d 100644 (file)
@@ -625,7 +625,8 @@ static ResponseType maybeHandleNotify(const MOADNSParser& mdp, const ComboAddres
 
   g_log<<Logger::Info<<logPrefix<<"NOTIFY for "<<mdp.d_qname<<"|"<<QType(mdp.d_qtype).toString()<<" "<< Opcode::to_s(mdp.d_header.opcode) <<" from "<<saddr.toStringWithPort()<<endl;
 
-  auto found = g_domainConfigs.find(ZoneName(mdp.d_qname));
+  ZoneName zonename(mdp.d_qname);
+  auto found = g_domainConfigs.find(zonename);
   if (found == g_domainConfigs.end()) {
     g_log<<Logger::Info<<("Domain name '" + mdp.d_qname.toLogString() + "' is not configured for notification")<<endl;
     return ResponseType::RefusedQuery;
@@ -643,12 +644,12 @@ static ResponseType maybeHandleNotify(const MOADNSParser& mdp, const ComboAddres
   }
 
   if (primaryFound) {
-    g_notifiesReceived.lock()->insert(ZoneName(mdp.d_qname));
+    g_notifiesReceived.lock()->insert(zonename);
 
     if (!found->second.notify.empty()) {
       for (const auto& address : found->second.notify) {
         g_log << Logger::Debug << logPrefix << "Queuing notification for " << mdp.d_qname << " to " << address.toStringWithPort() << std::endl;
-        g_notificationQueue.lock()->add(ZoneName(mdp.d_qname), address);
+        g_notificationQueue.lock()->add(zonename, address);
       }
     }
     return ResponseType::EmptyNoError;
@@ -680,12 +681,13 @@ static ResponseType checkQuery(const MOADNSParser& mdp, const ComboAddress& sadd
     }
 
     {
-      if (g_domainConfigs.find(ZoneName(mdp.d_qname)) == g_domainConfigs.end()) {
+      ZoneName zonename(mdp.d_qname);
+      if (g_domainConfigs.find(zonename) == g_domainConfigs.end()) {
         info_msg.push_back("Domain name '" + mdp.d_qname.toLogString() + "' is not configured for distribution");
         ret = ResponseType::RefusedQuery;
       }
       else {
-        const auto zoneInfo = getCurrentZoneInfo(ZoneName(mdp.d_qname));
+        const auto zoneInfo = getCurrentZoneInfo(zonename);
         if (zoneInfo == nullptr) {
           info_msg.emplace_back("Domain has not been transferred yet");
           ret = ResponseType::RefusedQuery;
@@ -872,9 +874,10 @@ static bool handleAXFR(int fd, const MOADNSParser& mdp) {
      until we release it.
   */
 
-  g_stats.incrementAXFRinQueries(ZoneName(mdp.d_qname));
+  ZoneName zonename(mdp.d_qname);
+  g_stats.incrementAXFRinQueries(zonename);
 
-  auto zoneInfo = getCurrentZoneInfo(ZoneName(mdp.d_qname));
+  auto zoneInfo = getCurrentZoneInfo(zonename);
   if (zoneInfo == nullptr) {
     return false;
   }
@@ -912,9 +915,10 @@ static bool handleIXFR(int fd, const MOADNSParser& mdp, const shared_ptr<const S
      until we release it.
   */
 
-  g_stats.incrementIXFRinQueries(ZoneName(mdp.d_qname));
+  ZoneName zonename(mdp.d_qname);
+  g_stats.incrementIXFRinQueries(zonename);
 
-  auto zoneInfo = getCurrentZoneInfo(ZoneName(mdp.d_qname));
+  auto zoneInfo = getCurrentZoneInfo(zonename);
   if (zoneInfo == nullptr) {
     return false;
   }
index c8ad2d40a43479ed1236a3db0ffe8ed0bf98a8ad..fae69d48cb4cb648a0d8795105fe0df6102f7e16 100644 (file)
@@ -152,7 +152,7 @@ bool makeIncreasedSOARecord(SOAData& sd, const string& increaseKind, const strin
   if (increaseKind.empty())
     return false;
 
-  sd.serial = calculateIncreaseSOA(sd.serial, increaseKind, editKind, ZoneName(sd.qname));
+  sd.serial = calculateIncreaseSOA(sd.serial, increaseKind, editKind, sd.zonename);
   rrout.qname = sd.qname;
   rrout.content = makeSOAContent(sd)->getZoneRepresentation(true);
   rrout.qtype = QType::SOA;
@@ -165,7 +165,7 @@ bool makeIncreasedSOARecord(SOAData& sd, const string& increaseKind, const strin
 
 DNSZoneRecord makeEditedDNSZRFromSOAData(DNSSECKeeper& dk, const SOAData& sd, DNSResourceRecord::Place place) {
   SOAData edited = sd;
-  edited.serial = calculateEditSOA(sd.serial, dk, ZoneName(sd.qname));
+  edited.serial = calculateEditSOA(sd.serial, dk, sd.zonename);
 
   DNSRecord soa;
   soa.d_name = sd.qname;
index 122eeac97bd3c5649029cd9131c4974ae3f221d2..8dfa2d9e03e3c518fcb2e40b02a7ebb95d8a5c4a 100644 (file)
@@ -1273,7 +1273,7 @@ int TCPNameserver::doIXFR(std::unique_ptr<DNSPacket>& q, int outsock)
       }
     }
 
-    serialPermitsIXFR = !rfc1982LessThan(serial, calculateEditSOA(sd.serial, dk, ZoneName(sd.qname)));
+    serialPermitsIXFR = !rfc1982LessThan(serial, calculateEditSOA(sd.serial, dk, sd.zonename));
   }
 
   if (serialPermitsIXFR) {
index 0225b76dbc25ebf751900a9e319a259bb2c7551e..87dc7ef4e6503b047e06382f796adcd11d1b714a 100644 (file)
@@ -270,7 +270,8 @@ public:
 
       fillSOAData(range.first->d_content, *soadata);
       soadata->ttl = range.first->d_ttl;
-      soadata->qname = best.operator const DNSName&();
+      soadata->zonename = best;
+      soadata->qname = soadata->zonename.operator const DNSName&();
       soadata->domain_id = static_cast<int>(zoneId);
       return true;
     }
@@ -1008,7 +1009,7 @@ BOOST_AUTO_TEST_CASE(test_child_zone) {
       // test getAuth() for DS
       SOAData sd;
       BOOST_REQUIRE(ub.getAuth(ZoneName("powerdns.com."), QType::DS, &sd));
-      BOOST_CHECK_EQUAL(sd.qname.toString(), "com.");
+      BOOST_CHECK_EQUAL(sd.zonename.toString(), "com.");
       BOOST_CHECK_EQUAL(sd.domain_id, 1);
     }
 
@@ -1016,7 +1017,7 @@ BOOST_AUTO_TEST_CASE(test_child_zone) {
       // test getAuth() for A
       SOAData sd;
       BOOST_REQUIRE(ub.getAuth(ZoneName("powerdns.com."), QType::A, &sd));
-      BOOST_CHECK_EQUAL(sd.qname.toString(), "powerdns.com.");
+      BOOST_CHECK_EQUAL(sd.zonename.toString(), "powerdns.com.");
       BOOST_CHECK_EQUAL(sd.domain_id, 2);
     }
 
@@ -1068,7 +1069,7 @@ BOOST_AUTO_TEST_CASE(test_multi_backends_best_soa) {
       // test getAuth()
       SOAData sd;
       BOOST_REQUIRE(ub.getAuth(ZoneName("2.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa."), QType::PTR, &sd));
-      BOOST_CHECK_EQUAL(sd.qname.toString(), "d.0.1.0.0.2.ip6.arpa.");
+      BOOST_CHECK_EQUAL(sd.zonename.toString(), "d.0.1.0.0.2.ip6.arpa.");
       BOOST_CHECK_EQUAL(sd.domain_id, 1);
 
       // check that at most one auth lookup occurred to this backend (O with caching enabled)
index 2d2242aa81ba5405c7f3688ebf9dc50711d8df3d..4d0c785a583bd0470326025a24ba7096e56d2d7d 100644 (file)
@@ -422,8 +422,8 @@ bool UeberBackend::fillSOAFromZoneRecord(ZoneName& shorter, const domainid_t zon
   }
 
   // Fill soaData.
-  soaData->qname = zoneRecord.dr.d_name.makeLowerCase();
   soaData->zonename = shorter.makeLowerCase();
+  soaData->qname = soaData->zonename.operator const DNSName&();
 
   try {
     fillSOAData(zoneRecord, *soaData);
@@ -457,8 +457,8 @@ UeberBackend::CacheResult UeberBackend::fillSOAFromCache(SOAData* soaData, ZoneN
     fillSOAData(d_answers[0], *soaData);
 
     soaData->db = backends.size() == 1 ? backends.begin()->get() : nullptr;
-    soaData->qname = shorter.operator const DNSName&().makeLowerCase();
     soaData->zonename = shorter.makeLowerCase();
+    soaData->qname = soaData->zonename.operator const DNSName&();
   }
   else if (cacheResult == CacheResult::NegativeMatch && d_negcache_ttl != 0U) {
     DLOG(g_log << Logger::Error << "has neg cache entry: " << shorter << endl);
index 8edab43635264f7599e65eb45380bf3f657c844a..d57c39677a5dcc7ac36e7a290c628d4610d06835 100644 (file)
@@ -343,7 +343,11 @@ ZoneName apiZoneIdToName(const string& identifier)
 
 string apiZoneNameToId(const ZoneName& dname)
 {
-  string name = dname.toString();
+  return apiNameToId(dname.toString());
+}
+
+string apiNameToId(const string& name)
+{
   ostringstream outputStringStream;
 
   for (char iter : name) {
index 76f1ef40775d13928133d4cae4d9779deb41d509..5fe8c132c903607d1eca93d9a80946c944252985 100644 (file)
@@ -34,6 +34,7 @@ void apiServerStatistics(HttpRequest* req, HttpResponse* resp);
 // helpers
 ZoneName apiZoneIdToName(const string& identifier);
 string apiZoneNameToId(const ZoneName& name);
+string apiNameToId(const std::string& name);
 void apiCheckNameAllowedCharacters(std::string_view name);
 void apiCheckQNameAllowedCharacters(std::string_view name);
 DNSName apiNameToDNSName(const string& name);
index f8557b12f544f7491d732df884f00b68d364399a..825fc5e32fad59b8bae06ab10087142a1fdd21bb 100644 (file)
@@ -431,13 +431,13 @@ static void fillZone(UeberBackend& backend, const ZoneName& zonename, HttpRespon
 
   Json::array tsig_primary_keys;
   for (const auto& keyname : tsig_primary) {
-    tsig_primary_keys.emplace_back(apiZoneNameToId(ZoneName(keyname)));
+    tsig_primary_keys.emplace_back(apiNameToId(keyname));
   }
   doc["master_tsig_key_ids"] = tsig_primary_keys;
 
   Json::array tsig_secondary_keys;
   for (const auto& keyname : tsig_secondary) {
-    tsig_secondary_keys.emplace_back(apiZoneNameToId(ZoneName(keyname)));
+    tsig_secondary_keys.emplace_back(apiNameToId(keyname));
   }
   doc["slave_tsig_key_ids"] = tsig_secondary_keys;
 
@@ -1648,7 +1648,7 @@ static Json::object makeJSONTSIGKey(const DNSName& keyname, const DNSName& algo,
 {
   Json::object tsigkey = {
     {"name", keyname.toStringNoDot()},
-    {"id", apiZoneNameToId(ZoneName(keyname))},
+    {"id", apiNameToId(keyname.toString())},
     {"algorithm", algo.toStringNoDot()},
     {"key", content},
     {"type", "TSIGKey"}};