From: Fred Morcos Date: Fri, 8 Sep 2023 11:56:34 +0000 (+0200) Subject: Formatting: ueberbackend.cc X-Git-Tag: rec-5.0.0-beta1~16^2~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03eca04c1f6dc3a659581519c6d42b9b3d8a2c0e;p=thirdparty%2Fpdns.git Formatting: ueberbackend.cc --- diff --git a/.not-formatted b/.not-formatted index c4d86e3d29..b1dd161184 100644 --- a/.not-formatted +++ b/.not-formatted @@ -295,7 +295,6 @@ ./pdns/tsigutils.hh ./pdns/tsigverifier.cc ./pdns/tsigverifier.hh -./pdns/ueberbackend.cc ./pdns/ueberbackend.hh ./pdns/unix_semaphore.cc ./pdns/unix_utility.cc diff --git a/pdns/ueberbackend.cc b/pdns/ueberbackend.cc index 6392adb25d..bd41c69ea7 100644 --- a/pdns/ueberbackend.cc +++ b/pdns/ueberbackend.cc @@ -29,7 +29,6 @@ #include "auth-zonecache.hh" #include "utility.hh" - #include #include #include @@ -50,24 +49,24 @@ extern StatBag S; -LockGuarded> UeberBackend::d_instances; +LockGuarded> UeberBackend::d_instances; // initially we are blocked -bool UeberBackend::d_go=false; -bool UeberBackend::s_doANYLookupsOnly=false; +bool UeberBackend::d_go = false; +bool UeberBackend::s_doANYLookupsOnly = false; std::mutex UeberBackend::d_mut; std::condition_variable UeberBackend::d_cond; AtomicCounter* UeberBackend::s_backendQueries = nullptr; //! Loads a module and reports it to all UeberBackend threads -bool UeberBackend::loadmodule(const string &name) +bool UeberBackend::loadmodule(const string& name) { - g_log<& modules, const string& path) { - for (const auto& module: modules) { + for (const auto& module : modules) { bool res; - if (module.find('.')==string::npos) { - res = UeberBackend::loadmodule(path+"/lib"+module+"backend.so"); - } else if (module[0]=='/' || (module[0]=='.' && module[1]=='/') || (module[0]=='.' && module[1]=='.')) { + if (module.find('.') == string::npos) { + res = UeberBackend::loadmodule(path + "/lib" + module + "backend.so"); + } + else if (module[0] == '/' || (module[0] == '.' && module[1] == '/') || (module[0] == '.' && module[1] == '.')) { // absolute or current path res = UeberBackend::loadmodule(module); - } else { - res = UeberBackend::loadmodule(path+"/"+module); + } + else { + res = UeberBackend::loadmodule(path + "/" + module); } if (res == false) { @@ -110,17 +111,17 @@ void UeberBackend::go() d_cond.notify_all(); } -bool UeberBackend::getDomainInfo(const DNSName &domain, DomainInfo &di, bool getSerial) +bool UeberBackend::getDomainInfo(const DNSName& domain, DomainInfo& di, bool getSerial) { - for(auto backend : backends) - if(backend->getDomainInfo(domain, di, getSerial)) + for (auto backend : backends) + if (backend->getDomainInfo(domain, di, getSerial)) return true; return false; } -bool UeberBackend::createDomain(const DNSName &domain, const DomainInfo::DomainKind kind, const vector &masters, const string &account) +bool UeberBackend::createDomain(const DNSName& domain, const DomainInfo::DomainKind kind, const vector& masters, const string& account) { - for(DNSBackend* mydb : backends) { + for (DNSBackend* mydb : backends) { if (mydb->createDomain(domain, kind, masters, account)) { return true; } @@ -130,8 +131,8 @@ bool UeberBackend::createDomain(const DNSName &domain, const DomainInfo::DomainK bool UeberBackend::doesDNSSEC() { - for(auto* db : backends) { - if(db->doesDNSSEC()) + for (auto* db : backends) { + if (db->doesDNSSEC()) return true; } return false; @@ -140,25 +141,25 @@ bool UeberBackend::doesDNSSEC() bool UeberBackend::addDomainKey(const DNSName& name, const DNSBackend::KeyData& key, int64_t& id) { id = -1; - for(DNSBackend* db : backends) { - if(db->addDomainKey(name, key, id)) + for (DNSBackend* db : backends) { + if (db->addDomainKey(name, key, id)) return true; } return false; } bool UeberBackend::getDomainKeys(const DNSName& name, std::vector& keys) { - for(DNSBackend* db : backends) { - if(db->getDomainKeys(name, keys)) + for (DNSBackend* db : backends) { + if (db->getDomainKeys(name, keys)) return true; } return false; } -bool UeberBackend::getAllDomainMetadata(const DNSName& name, std::map >& meta) +bool UeberBackend::getAllDomainMetadata(const DNSName& name, std::map>& meta) { - for(DNSBackend* db : backends) { - if(db->getAllDomainMetadata(name, meta)) + for (DNSBackend* db : backends) { + if (db->getAllDomainMetadata(name, meta)) return true; } return false; @@ -166,8 +167,8 @@ bool UeberBackend::getAllDomainMetadata(const DNSName& name, std::map& meta) { - for(DNSBackend* db : backends) { - if(db->getDomainMetadata(name, kind, meta)) + for (DNSBackend* db : backends) { + if (db->getDomainMetadata(name, kind, meta)) return true; } return false; @@ -186,8 +187,8 @@ bool UeberBackend::getDomainMetadata(const DNSName& name, const std::string& kin bool UeberBackend::setDomainMetadata(const DNSName& name, const std::string& kind, const std::vector& meta) { - for(DNSBackend* db : backends) { - if(db->setDomainMetadata(name, kind, meta)) + for (DNSBackend* db : backends) { + if (db->setDomainMetadata(name, kind, meta)) return true; } return false; @@ -204,8 +205,8 @@ bool UeberBackend::setDomainMetadata(const DNSName& name, const std::string& kin bool UeberBackend::activateDomainKey(const DNSName& name, unsigned int id) { - for(DNSBackend* db : backends) { - if(db->activateDomainKey(name, id)) + for (DNSBackend* db : backends) { + if (db->activateDomainKey(name, id)) return true; } return false; @@ -213,8 +214,8 @@ bool UeberBackend::activateDomainKey(const DNSName& name, unsigned int id) bool UeberBackend::deactivateDomainKey(const DNSName& name, unsigned int id) { - for(DNSBackend* db : backends) { - if(db->deactivateDomainKey(name, id)) + for (DNSBackend* db : backends) { + if (db->deactivateDomainKey(name, id)) return true; } return false; @@ -222,8 +223,8 @@ bool UeberBackend::deactivateDomainKey(const DNSName& name, unsigned int id) bool UeberBackend::publishDomainKey(const DNSName& name, unsigned int id) { - for(DNSBackend* db : backends) { - if(db->publishDomainKey(name, id)) + for (DNSBackend* db : backends) { + if (db->publishDomainKey(name, id)) return true; } return false; @@ -231,34 +232,31 @@ bool UeberBackend::publishDomainKey(const DNSName& name, unsigned int id) bool UeberBackend::unpublishDomainKey(const DNSName& name, unsigned int id) { - for(DNSBackend* db : backends) { - if(db->unpublishDomainKey(name, id)) + for (DNSBackend* db : backends) { + if (db->unpublishDomainKey(name, id)) return true; } return false; } - bool UeberBackend::removeDomainKey(const DNSName& name, unsigned int id) { - for(DNSBackend* db : backends) { - if(db->removeDomainKey(name, id)) + for (DNSBackend* db : backends) { + if (db->removeDomainKey(name, id)) return true; } return false; } - - void UeberBackend::reload() { - for (auto & backend : backends) - { + for (auto& backend : backends) { backend->reload(); } } -void UeberBackend::updateZoneCache() { +void UeberBackend::updateZoneCache() +{ if (!g_zoneCache.isEnabled()) { return; } @@ -266,58 +264,52 @@ void UeberBackend::updateZoneCache() { vector> zone_indices; g_zoneCache.setReplacePending(); - for (vector::iterator i = backends.begin(); i != backends.end(); ++i ) - { + for (vector::iterator i = backends.begin(); i != backends.end(); ++i) { vector zones; (*i)->getAllDomains(&zones, false, true); - for(auto& di: zones) { + for (auto& di : zones) { zone_indices.emplace_back(std::move(di.zone), (int)di.id); // this cast should not be necessary } } g_zoneCache.replace(zone_indices); } -void UeberBackend::rediscover(string *status) +void UeberBackend::rediscover(string* status) { - for ( vector< DNSBackend * >::iterator i = backends.begin(); i != backends.end(); ++i ) - { + for (vector::iterator i = backends.begin(); i != backends.end(); ++i) { string tmpstr; - ( *i )->rediscover(&tmpstr); - if(status) - *status+=tmpstr + (i!=backends.begin() ? "\n" : ""); + (*i)->rediscover(&tmpstr); + if (status) + *status += tmpstr + (i != backends.begin() ? "\n" : ""); } updateZoneCache(); } - void UeberBackend::getUnfreshSlaveInfos(vector* domains) { - for (auto & backend : backends) - { - backend->getUnfreshSlaveInfos( domains ); - } + for (auto& backend : backends) { + backend->getUnfreshSlaveInfos(domains); + } } void UeberBackend::getUpdatedMasters(vector& domains, std::unordered_set& catalogs, CatalogHashMap& catalogHashes) { - for (auto & backend : backends) - { + for (auto& backend : backends) { backend->getUpdatedMasters(domains, catalogs, catalogHashes); } } bool UeberBackend::inTransaction() { - for (auto* b : backends ) - { - if(b->inTransaction()) + for (auto* b : backends) { + if (b->inTransaction()) return true; } return false; } -bool UeberBackend::getAuth(const DNSName &target, const QType& qtype, SOAData* sd, bool cachedOk) +bool UeberBackend::getAuth(const DNSName& target, const QType& qtype, SOAData* sd, bool cachedOk) { // A backend can respond to our authority request with the 'best' match it // has. For example, when asked for a.b.c.example.com. it might respond with @@ -328,10 +320,10 @@ bool UeberBackend::getAuth(const DNSName &target, const QType& qtype, SOAData* s bool found = false; int cstat; DNSName shorter(target); - vector > bestmatch (backends.size(), pair(target.wirelength()+1, SOAData())); + vector> bestmatch(backends.size(), pair(target.wirelength() + 1, SOAData())); do { int zoneId{-1}; - if(cachedOk && g_zoneCache.isEnabled()) { + if (cachedOk && g_zoneCache.isEnabled()) { if (g_zoneCache.getEntry(shorter, zoneId)) { // Zone exists in zone cache, directly look up SOA. DNSZoneRecord zr; @@ -341,7 +333,7 @@ bool UeberBackend::getAuth(const DNSName &target, const QType& qtype, SOAData* s continue; } if (zr.dr.d_name != shorter) { - throw PDNSException("getAuth() returned an SOA for the wrong zone. Zone '"+zr.dr.d_name.toLogString()+"' is not equal to looked up zone '"+shorter.toLogString()+"'"); + throw PDNSException("getAuth() returned an SOA for the wrong zone. Zone '" + zr.dr.d_name.toLogString() + "' is not equal to looked up zone '" + shorter.toLogString() + "'"); } // fill sd sd->qname = zr.dr.d_name; @@ -374,69 +366,75 @@ bool UeberBackend::getAuth(const DNSName &target, const QType& qtype, SOAData* s d_question.zoneId = zoneId; // Check cache - if(cachedOk && (d_cache_ttl || d_negcache_ttl)) { - cstat = cacheHas(d_question,d_answers); + if (cachedOk && (d_cache_ttl || d_negcache_ttl)) { + cstat = cacheHas(d_question, d_answers); - if(cstat == 1 && !d_answers.empty() && d_cache_ttl) { - DLOG(g_log<db = *backends.begin(); - } else { + } + else { sd->db = nullptr; } sd->qname = shorter; goto found; - } else if(cstat == 0 && d_negcache_ttl) { - DLOG(g_log<::const_iterator i = backends.begin(); - vector >::iterator j = bestmatch.begin(); - for(; i != backends.end() && j != bestmatch.end(); ++i, ++j) { + vector::const_iterator i = backends.begin(); + vector>::iterator j = bestmatch.begin(); + for (; i != backends.end() && j != bestmatch.end(); ++i, ++j) { - DLOG(g_log<first < shorter.wirelength()) { - DLOG(g_log<second.qname<first < shorter.wirelength()) { + DLOG(g_log << Logger::Error << "skipped, we already found a shorter best match in this backend: " << j->second.qname << endl); continue; - } else if(j->first == shorter.wirelength()) { - DLOG(g_log<second.qname<first == shorter.wirelength()) { + DLOG(g_log << Logger::Error << "use shorter best match: " << j->second.qname << endl); *sd = j->second; break; - } else { - DLOG(g_log<getAuth(shorter, sd)) { - DLOG(g_log<qname<qname.empty() && !shorter.isPartOf(sd->qname)) { - throw PDNSException("getAuth() returned an SOA for the wrong zone. Zone '"+sd->qname.toLogString()+"' is not part of '"+shorter.toLogString()+"'"); + } + else { + DLOG(g_log << Logger::Error << "lookup: " << shorter << endl); + if ((*i)->getAuth(shorter, sd)) { + DLOG(g_log << Logger::Error << "got: " << sd->qname << endl); + if (!sd->qname.empty() && !shorter.isPartOf(sd->qname)) { + throw PDNSException("getAuth() returned an SOA for the wrong zone. Zone '" + sd->qname.toLogString() + "' is not part of '" + shorter.toLogString() + "'"); } j->first = sd->qname.wirelength(); j->second = *sd; - if(sd->qname == shorter) { + if (sd->qname == shorter) { break; } - } else { - DLOG(g_log<qname<qname << endl); d_question.qtype = QType::SOA; d_question.qname = sd->qname; d_question.zoneId = zoneId; @@ -452,31 +450,32 @@ bool UeberBackend::getAuth(const DNSName &target, const QType& qtype, SOAData* s } } -found: - if(found == (qtype == QType::DS) || target != shorter) { - DLOG(g_log<qname<qname << endl); return true; - } else { - DLOG(g_log<qname<qname << endl); found = true; } - } while(shorter.chopOff()); + } while (shorter.chopOff()); return found; } -bool UeberBackend::getSOAUncached(const DNSName &domain, SOAData &sd) +bool UeberBackend::getSOAUncached(const DNSName& domain, SOAData& sd) { - d_question.qtype=QType::SOA; - d_question.qname=domain; - d_question.zoneId=-1; + d_question.qtype = QType::SOA; + d_question.qname = domain; + d_question.zoneId = -1; - for(auto backend : backends) - if(backend->getSOA(domain, sd)) { - if(domain != sd.qname) { - throw PDNSException("getSOA() returned an SOA for the wrong zone. Question: '"+domain.toLogString()+"', answer: '"+sd.qname.toLogString()+"'"); + for (auto backend : backends) + if (backend->getSOA(domain, sd)) { + if (domain != sd.qname) { + throw PDNSException("getSOA() returned an SOA for the wrong zone. Question: '" + domain.toLogString() + "', answer: '" + sd.qname.toLogString() + "'"); } - if(d_cache_ttl) { + if (d_cache_ttl) { DNSZoneRecord rr; rr.dr.d_name = sd.qname; rr.dr.d_type = QType::SOA; @@ -485,62 +484,61 @@ bool UeberBackend::getSOAUncached(const DNSName &domain, SOAData &sd) rr.domain_id = sd.domain_id; addCache(d_question, {rr}); - } return true; } - if(d_negcache_ttl) + if (d_negcache_ttl) addNegCache(d_question); return false; } -bool UeberBackend::superMasterAdd(const AutoPrimary &primary) +bool UeberBackend::superMasterAdd(const AutoPrimary& primary) { - for(auto backend : backends) - if(backend->superMasterAdd(primary)) + for (auto backend : backends) + if (backend->superMasterAdd(primary)) return true; return false; } -bool UeberBackend::autoPrimaryRemove(const AutoPrimary &primary) +bool UeberBackend::autoPrimaryRemove(const AutoPrimary& primary) { - for(auto backend : backends) - if(backend->autoPrimaryRemove(primary)) + for (auto backend : backends) + if (backend->autoPrimaryRemove(primary)) return true; return false; } bool UeberBackend::autoPrimariesList(std::vector& primaries) { - for(auto backend : backends) - if(backend->autoPrimariesList(primaries)) - return true; - return false; + for (auto backend : backends) + if (backend->autoPrimariesList(primaries)) + return true; + return false; } -bool UeberBackend::superMasterBackend(const string &ip, const DNSName &domain, const vector&nsset, string *nameserver, string *account, DNSBackend **db) +bool UeberBackend::superMasterBackend(const string& ip, const DNSName& domain, const vector& nsset, string* nameserver, string* account, DNSBackend** db) { - for(auto backend : backends) - if(backend->superMasterBackend(ip, domain, nsset, nameserver, account, db)) + for (auto backend : backends) + if (backend->superMasterBackend(ip, domain, nsset, nameserver, account, db)) return true; return false; } -UeberBackend::UeberBackend(const string &pname) +UeberBackend::UeberBackend(const string& pname) { { d_instances.lock()->push_back(this); // report to the static list of ourself } - d_negcached=false; - d_cached=false; + d_negcached = false; + d_cached = false; d_cache_ttl = ::arg().asNum("query-cache-ttl"); d_negcache_ttl = ::arg().asNum("negquery-cache-ttl"); d_qtype = 0; d_stale = false; - backends=BackendMakers().all(pname=="key-only"); + backends = BackendMakers().all(pname == "key-only"); } static void del(DNSBackend* d) @@ -553,164 +551,163 @@ void UeberBackend::cleanup() { auto instances = d_instances.lock(); remove(instances->begin(), instances->end(), this); - instances->resize(instances->size()-1); + instances->resize(instances->size() - 1); } - for_each(backends.begin(),backends.end(),del); + for_each(backends.begin(), backends.end(), del); } // returns -1 for miss, 0 for negative match, 1 for hit -int UeberBackend::cacheHas(const Question &q, vector &rrs) +int UeberBackend::cacheHas(const Question& q, vector& rrs) { extern AuthQueryCache QC; - if(!d_cache_ttl && ! d_negcache_ttl) { + if (!d_cache_ttl && !d_negcache_ttl) { return -1; } rrs.clear(); // g_log<(), d_negcache_ttl, q.zoneId); } -void UeberBackend::addCache(const Question &q, vector &&rrs) +void UeberBackend::addCache(const Question& q, vector&& rrs) { extern AuthQueryCache QC; - if(!d_cache_ttl) + if (!d_cache_ttl) return; - for(const auto& rr : rrs) { - if (rr.scopeMask) - return; + for (const auto& rr : rrs) { + if (rr.scopeMask) + return; } QC.insert(q.qname, q.qtype, std::move(rrs), d_cache_ttl, q.zoneId); } -void UeberBackend::alsoNotifies(const DNSName &domain, set *ips) +void UeberBackend::alsoNotifies(const DNSName& domain, set* ips) { - for (auto & backend : backends) - backend->alsoNotifies(domain,ips); + for (auto& backend : backends) + backend->alsoNotifies(domain, ips); } UeberBackend::~UeberBackend() { - DLOG(g_log< l(d_mut); - d_cond.wait(l, []{ return d_go == true; }); - g_log<lookup(d_handle.qtype, d_handle.qname, d_handle.zoneId, d_handle.pkt_p); + d_negcached = d_cached = false; + d_answers.clear(); + (d_handle.d_hinterBackend = backends[d_handle.i++])->lookup(d_handle.qtype, d_handle.qname, d_handle.zoneId, d_handle.pkt_p); ++(*s_backendQueries); - } - else if(cstat==0) { + } + else if (cstat == 0) { // cout<<"UeberBackend::lookup("<* domains, bool getSerial, bool include_disabled) { - for (auto & backend : backends) - { + for (auto& backend : backends) { backend->getAllDomains(domains, getSerial, include_disabled); } } -bool UeberBackend::get(DNSZoneRecord &rr) +bool UeberBackend::get(DNSZoneRecord& rr) { // cout<<"UeberBackend::get(DNSZoneRecord) called"<& result) { bool rc = false; - for ( vector< DNSBackend * >::iterator i = backends.begin(); result.size() < static_cast::size_type>(maxResults) && i != backends.end(); ++i ) - if ((*i)->searchRecords(pattern, maxResults - result.size(), result)) rc = true; + for (vector::iterator i = backends.begin(); result.size() < static_cast::size_type>(maxResults) && i != backends.end(); ++i) + if ((*i)->searchRecords(pattern, maxResults - result.size(), result)) + rc = true; return rc; } bool UeberBackend::searchComments(const string& pattern, int maxResults, vector& result) { bool rc = false; - for ( vector< DNSBackend * >::iterator i = backends.begin(); result.size() < static_cast::size_type>(maxResults) && i != backends.end(); ++i ) - if ((*i)->searchComments(pattern, maxResults - result.size(), result)) rc = true; + for (vector::iterator i = backends.begin(); result.size() < static_cast::size_type>(maxResults) && i != backends.end(); ++i) + if ((*i)->searchComments(pattern, maxResults - result.size(), result)) + rc = true; return rc; } @@ -793,10 +792,10 @@ UeberBackend::handle::handle() { // g_log<get(r))) { // this backend out of answers - if(ibackends.size()) { - DLOG(g_log<<"Backend #"<backends.size() - <<" out of answers, taking next"<backends[i++]; - d_hinterBackend->lookup(qtype,qname,zoneId,pkt_p); + DLOG(g_log << "Ueber get() was called for a " << qtype << " record" << endl); + bool isMore = false; + while (d_hinterBackend && !(isMore = d_hinterBackend->get(r))) { // this backend out of answers + if (i < parent->backends.size()) { + DLOG(g_log << "Backend #" << i << " of " << parent->backends.size() + << " out of answers, taking next" << endl); + + d_hinterBackend = parent->backends[i++]; + d_hinterBackend->lookup(qtype, qname, zoneId, pkt_p); ++(*s_backendQueries); } - else + else break; - DLOG(g_log<<"Now asking backend #"<backends.size()) { - DLOG(g_log<<"UeberBackend reached end of backends"<backends.size()) { + DLOG(g_log << "UeberBackend reached end of backends" << endl); return false; } - DLOG(g_log<<"Found an answering backend - will not try another one"<backends.size(); // don't go on to the next backend + DLOG(g_log << "Found an answering backend - will not try another one" << endl); + i = parent->backends.size(); // don't go on to the next backend return true; }