From ca2a9114daa3556ca60174fe6e7f297a950ce0bc Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Thu, 10 May 2018 18:37:24 +0300 Subject: [PATCH] geoipbackend: Optimize lookup Avoids expensive copying operations --- modules/geoipbackend/geoipbackend.cc | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/modules/geoipbackend/geoipbackend.cc b/modules/geoipbackend/geoipbackend.cc index 0d2e93aac..6bab3c4fe 100644 --- a/modules/geoipbackend/geoipbackend.cc +++ b/modules/geoipbackend/geoipbackend.cc @@ -301,7 +301,7 @@ GeoIPBackend::~GeoIPBackend() { } bool GeoIPBackend::lookup_static(const GeoIPDomain &dom, const DNSName &search, const QType &qtype, const DNSName& qdomain, const std::string &ip, GeoIPNetmask &gl, bool v6) { - const auto i = dom.records.find(search); + const auto& i = dom.records.find(search); int cumul_probability = 0; int probability_rnd = 1+(dns_random(1000)); // setting probability=0 means it never is used @@ -334,23 +334,21 @@ bool GeoIPBackend::lookup_static(const GeoIPDomain &dom, const DNSName &search, void GeoIPBackend::lookup(const QType &qtype, const DNSName& qdomain, DNSPacket *pkt_p, int zoneId) { ReadLock rl(&s_state_lock); - GeoIPDomain dom; + const GeoIPDomain* dom; GeoIPNetmask gl; bool found = false; if (d_result.size()>0) throw PDNSException("Cannot perform lookup while another is running"); - DNSName search = qdomain; - d_result.clear(); if (zoneId > -1 && zoneId < static_cast(s_domains.size())) - dom = s_domains[zoneId]; + dom = &(s_domains[zoneId]); else { for(const GeoIPDomain& i : s_domains) { // this is arguably wrong, we should probably find the most specific match - if (search.isPartOf(i.domain)) { - dom = i; + if (qdomain.isPartOf(i.domain)) { + dom = &i; found = true; break; } @@ -367,10 +365,10 @@ void GeoIPBackend::lookup(const QType &qtype, const DNSName& qdomain, DNSPacket gl.netmask = 0; - (void)this->lookup_static(dom, search, qtype, qdomain, ip, gl, v6); + (void)this->lookup_static(*dom, qdomain, qtype, qdomain, ip, gl, v6); - auto target = dom.services.find(search); - if (target == dom.services.end()) return; // no hit + const auto& target = (*dom).services.find(qdomain); + if (target == (*dom).services.end()) return; // no hit const NetmaskTree >::node_type* node = target->second.masks.lookup(ComboAddress(ip)); if (node == NULL) return; // no hit, again. @@ -400,7 +398,7 @@ void GeoIPBackend::lookup(const QType &qtype, const DNSName& qdomain, DNSPacket sformat = DNSName(format2str(*it, ip, v6, gl)); // see if the record can be found - if (this->lookup_static(dom, sformat, qtype, qdomain, ip, gl, v6)) + if (this->lookup_static((*dom), sformat, qtype, qdomain, ip, gl, v6)) return; } @@ -417,12 +415,12 @@ void GeoIPBackend::lookup(const QType &qtype, const DNSName& qdomain, DNSPacket if (!(qtype == QType::ANY || qtype == QType::CNAME)) return; DNSResourceRecord rr; - rr.domain_id = dom.id; + rr.domain_id = dom->id; rr.qtype = QType::CNAME; rr.qname = qdomain; rr.content = sformat.toString(); rr.auth = 1; - rr.ttl = dom.ttl; + rr.ttl = dom->ttl; rr.scopeMask = gl.netmask; d_result.push_back(rr); } -- 2.40.0