From b5cb63baeeb52b03348de1ec3798fc3c143aa726 Mon Sep 17 00:00:00 2001 From: Peter van Dijk Date: Fri, 28 Apr 2023 14:37:22 +0200 Subject: [PATCH] filter duplicate domain entries --- modules/lmdbbackend/lmdbbackend.cc | 53 ++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 23804d3674..5da5503b45 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -1660,14 +1660,53 @@ bool LMDBBackend::createDomain(const DNSName& domain, const DomainInfo::DomainKi } void LMDBBackend::getAllDomainsFiltered(vector* domains, const std::function& allow) { - auto txn = d_tdomains->getROTransaction(); - for (auto iter = txn.begin(); iter != txn.end(); ++iter) { - DomainInfo di = *iter; - di.id = iter.getID(); - di.backend = this; + if (d_handle_dups) { + cerr<<"handling dups"<getROTransaction(); + + map zonemap; + set dups; - if (allow (di)) { - domains->push_back(di); + for (auto iter = txn.begin(); iter != txn.end(); ++iter) { + DomainInfo di = *iter; + di.id = iter.getID(); + di.backend = this; + + if (zonemap.count(di.zone) == 1) { + dups.insert(di.zone); + } + else { + zonemap[di.zone] = di; + } + } + + for (const auto& zone : dups) { + DomainInfo di; + + if (!(di.id = txn.get<0>(zone, di))) { + continue; + } + + di.backend = this; + zonemap[di.zone] = di; + } + + for (auto [k,v] : zonemap) { + if (allow (v)) { + domains->push_back(v); + } + } + } + else { + auto txn = d_tdomains->getROTransaction(); + for (auto iter = txn.begin(); iter != txn.end(); ++iter) { + DomainInfo di = *iter; + di.id = iter.getID(); + di.backend = this; + + if (allow (di)) { + domains->push_back(di); + } } } } -- 2.47.2