From: Remi Gacogne Date: Mon, 27 Aug 2018 15:47:52 +0000 (+0200) Subject: ixfrdist: Small optimizations for a large number of zones, add debug X-Git-Tag: dnsdist-1.3.3~143^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4d2bb6668a4137cf8fe97b82dd04528b7abcee87;p=thirdparty%2Fpdns.git ixfrdist: Small optimizations for a large number of zones, add debug --- diff --git a/pdns/ixfrdist.cc b/pdns/ixfrdist.cc index cd849dadfd..ab69a91d07 100644 --- a/pdns/ixfrdist.cc +++ b/pdns/ixfrdist.cc @@ -226,8 +226,9 @@ void updateThread(const string& workdir, const uint16_t& keep, const uint16_t& a loadZoneFromDisk(records, fname, domain); } std::lock_guard guard(g_soas_mutex); - g_soas[domain].latestAXFR = records; - g_soas[domain].soa = soa; + auto& zoneInfos = g_soas[domain]; + zoneInfos.latestAXFR = records; + zoneInfos.soa = soa; } if (soa != nullptr) { g_log<d_st.serial< current_soa; { std::lock_guard guard(g_soas_mutex); - if (g_soas.find(domain) != g_soas.end()) { - current_soa = g_soas[domain].soa; + const auto& zoneInfos = g_soas.find(domain); + if (zoneInfos != g_soas.end()) { + current_soa = zoneInfos->second.soa; } } - if ((current_soa != nullptr && now - lastCheck[domain] < current_soa->d_st.refresh) || // Only check if we have waited `refresh` seconds - (current_soa == nullptr && now - lastCheck[domain] < 30)) { // Or if we could not get an update at all still, every 30 seconds + + auto& zoneLastCheck = lastCheck[domain]; + if ((current_soa != nullptr && now - zoneLastCheck < current_soa->d_st.refresh) || // Only check if we have waited `refresh` seconds + (current_soa == nullptr && now - zoneLastCheck < 30)) { // Or if we could not get an update at all still, every 30 seconds continue; } // TODO Keep track of 'down' masters - set::const_iterator it(g_domainConfigs[domain].masters.begin()); - std::advance(it, random() % g_domainConfigs[domain].masters.size()); + set::const_iterator it(domainConfig.second.masters.begin()); + std::advance(it, random() % domainConfig.second.masters.size()); ComboAddress master = *it; string dir = workdir + "/" + domain.toString(); g_log< sr; try { - lastCheck[domain] = now; + zoneLastCheck = now; auto newSerial = getSerialFromMaster(master, domain, sr); // TODO TSIG if(current_soa != nullptr) { g_log<d_st.serial; @@ -340,18 +345,22 @@ void updateThread(const string& workdir, const uint16_t& keep, const uint16_t& a { std::lock_guard guard(g_soas_mutex); ixfrdiff_t diff; - if (!g_soas[domain].latestAXFR.empty()) { - makeIXFRDiff(g_soas[domain].latestAXFR, records, diff, g_soas[domain].soa, soa); - g_soas[domain].ixfrDiffs.push_back(std::move(diff)); + auto& zoneInfos = g_soas[domain]; + if (!zoneInfos.latestAXFR.empty()) { + g_log< keep) { - g_soas[domain].ixfrDiffs.erase(g_soas[domain].ixfrDiffs.begin()); + while (zoneInfos.ixfrDiffs.size() > keep) { + zoneInfos.ixfrDiffs.erase(zoneInfos.ixfrDiffs.begin()); } - g_soas[domain].latestAXFR = std::move(records); - g_soas[domain].soa = soa; + g_log<>& packets) { // Make copies of what we have std::lock_guard guard(g_soas_mutex); - soa = g_soas[mdp.d_qname].soa; - records = g_soas[mdp.d_qname].latestAXFR; + const auto& zoneInfos = g_soas[mdp.d_qname]; + soa = zoneInfos.soa; + records = zoneInfos.latestAXFR; } packets.reserve(packets.size() + /* SOAs */ 2 + records.size()); @@ -480,10 +490,12 @@ bool makeAXFRPackets(const MOADNSParser& mdp, vector>& packets) } void makeXFRPacketsFromDNSRecords(const MOADNSParser& mdp, const vector& records, vector>& packets) { + for(const auto& r : records) { if (r.d_type == QType::SOA) { continue; } + vector packet; DNSPacketWriter pw(packet, mdp.d_qname, mdp.d_qtype); pw.getHeader()->id = mdp.d_header.id; @@ -555,6 +567,8 @@ bool makeIXFRPackets(const MOADNSParser& mdp, const shared_ptr * ... added records ... * SOA new_serial */ + packets.reserve(packets.size() + /* SOAs */ 4 + diff.removals.size() + diff.additions.size()); + packets.push_back(getSOAPacket(mdp, diff.newSOA)); packets.push_back(getSOAPacket(mdp, diff.oldSOA)); makeXFRPacketsFromDNSRecords(mdp, diff.removals, packets);