From: Pieter Lexis Date: Thu, 22 Feb 2018 08:41:41 +0000 (+0100) Subject: ixfrdist: fix nits and add optimization X-Git-Tag: dnsdist-1.3.0~87^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ddd3fe8dc5311776ac8f1edec8abd2d1b03d4bde;p=pdns ixfrdist: fix nits and add optimization --- diff --git a/pdns/ixfrdist.cc b/pdns/ixfrdist.cc index b048e9db8..c73c4ee22 100644 --- a/pdns/ixfrdist.cc +++ b/pdns/ixfrdist.cc @@ -154,7 +154,7 @@ void cleanUpDomain(const DNSName& domain) { } } -shared_ptr getSOAFromRecords(const records_t& records) { +static shared_ptr getSOAFromRecords(const records_t& records) { for (const auto& dnsrecord : records) { if (dnsrecord.d_type == QType::SOA) { auto soa = getRR(dnsrecord); @@ -167,11 +167,17 @@ shared_ptr getSOAFromRecords(const records_t& records) { throw PDNSException("No SOA in supplied records"); } -void makeIXFRDiff(const records_t& from, const records_t& to, ixfrdiff_t& diff) { +static void makeIXFRDiff(const records_t& from, const records_t& to, ixfrdiff_t& diff, const shared_ptr& fromSOA = nullptr, const shared_ptr& toSOA = nullptr) { set_difference(from.cbegin(), from.cend(), to.cbegin(), to.cend(), back_inserter(diff.removals), from.value_comp()); set_difference(to.cbegin(), to.cend(), from.cbegin(), from.cend(), back_inserter(diff.additions), from.value_comp()); - diff.oldSOA = getSOAFromRecords(from); - diff.newSOA = getSOAFromRecords(to); + diff.oldSOA = fromSOA; + if (fromSOA == nullptr) { + getSOAFromRecords(from); + } + diff.newSOA = toSOA; + if (toSOA == nullptr) { + getSOAFromRecords(to); + } } void updateThread() { @@ -195,7 +201,6 @@ void updateThread() { loadZoneFromDisk(records, fname, domain); } std::lock_guard guard(g_soas_mutex); - g_soas[domain] = ixfrinfo_t(); g_soas[domain].latestAXFR = records; g_soas[domain].soa = soa; } @@ -316,7 +321,7 @@ void updateThread() { std::lock_guard guard(g_soas_mutex); ixfrdiff_t diff; if (!g_soas[domain].latestAXFR.empty()) { - makeIXFRDiff(g_soas[domain].latestAXFR, records, diff); + makeIXFRDiff(g_soas[domain].latestAXFR, records, diff, g_soas[domain].soa, soa); g_soas[domain].ixfrDiffs.push_back(diff); } // Clean up the diffs