From: bert hubert Date: Thu, 13 Mar 2014 08:08:41 +0000 (+0100) Subject: add code to detect removal and new domains in bindbackend X-Git-Tag: rec-3.6.0-rc1~138^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6b947ad5eb78f904ff46df1686dda82f2a6a759a;p=thirdparty%2Fpdns.git add code to detect removal and new domains in bindbackend --- diff --git a/modules/bindbackend/bindbackend2.cc b/modules/bindbackend/bindbackend2.cc index a92ae5b58a..f2307cbf33 100644 --- a/modules/bindbackend/bindbackend2.cc +++ b/modules/bindbackend/bindbackend2.cc @@ -131,6 +131,20 @@ bool Bind2Backend::safeGetBBDomainInfo(const std::string& name, BB2DomainInfo* b return true; } +bool Bind2Backend::safeRemoveBBDomainInfo(const std::string& name) +{ + WriteLock rl(&s_state_lock); + typedef state_t::index::type nameindex_t; + nameindex_t& nameindex = boost::multi_index::get(s_state); + + nameindex_t::iterator iter = nameindex.find(name); + if(iter == nameindex.end()) + return false; + nameindex.erase(iter); + return true; +} + + void Bind2Backend::safePutBBDomainInfo(const BB2DomainInfo& bbd) { WriteLock rl(&s_state_lock); @@ -707,10 +721,16 @@ void Bind2Backend::loadConfig(string* status) L< oldnames, newnames; + { + ReadLock rl(&s_state_lock); + BOOST_FOREACH(const BB2DomainInfo& bbd, s_state) { + oldnames.insert(bbd.d_name); + } + } int rejected=0; int newdomains=0; - // random_shuffle(domains.begin(), domains.end()); struct stat st; for(vector::iterator i=domains.begin(); i!=domains.end(); ++i) @@ -780,24 +800,25 @@ void Bind2Backend::loadConfig(string* status) // figure out which domains were new and which vanished int remdomains=0; - set oldnames, newnames; -#if 0 - for(state_t::const_iterator j=state.get()->id_zone_map.begin();j != s_state.get()->id_zone_map.end();++j) { - oldnames.insert(j->second.d_name); - } - for(id_zone_map_t::const_iterator j=staging->id_zone_map.begin(); j!= staging->id_zone_map.end(); ++j) { - newnames.insert(j->second.d_name); + { + ReadLock rl(&s_state_lock); + BOOST_FOREACH(const BB2DomainInfo& bbd, s_state) { + newnames.insert(bbd.d_name); + } } -#endif vector diff; set_difference(oldnames.begin(), oldnames.end(), newnames.begin(), newnames.end(), back_inserter(diff)); remdomains=diff.size(); + + BOOST_FOREACH(const std::string& name, diff) { + safeRemoveBBDomainInfo(name); + } // count number of entirely new domains - vector diff2; - set_difference(newnames.begin(), newnames.end(), oldnames.begin(), oldnames.end(), back_inserter(diff2)); - newdomains=diff2.size(); + diff.clear(); + set_difference(newnames.begin(), newnames.end(), oldnames.begin(), oldnames.end(), back_inserter(diff)); + newdomains=diff.size(); ostringstream msg; msg<<" Done parsing domains, "< d_dnssecdb; bool getNSEC3PARAM(const std::string& zname, NSEC3PARAMRecordContent* ns3p);