From: Pavel Boldin Date: Wed, 18 Sep 2013 10:39:32 +0000 (+0400) Subject: bind-supermaster-lock: use different lock for supermaster config file X-Git-Tag: rec-3.6.0-rc1~386^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F1027%2Fhead;p=thirdparty%2Fpdns.git bind-supermaster-lock: use different lock for supermaster config file --- diff --git a/pdns/backends/bind/bindbackend2.cc b/pdns/backends/bind/bindbackend2.cc index 5c19bc958b..ef0bb9cc19 100644 --- a/pdns/backends/bind/bindbackend2.cc +++ b/pdns/backends/bind/bindbackend2.cc @@ -81,6 +81,7 @@ bool Bind2Backend::s_ignore_broken_records=false; pthread_mutex_t Bind2Backend::s_startup_lock=PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t Bind2Backend::s_state_lock=PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t Bind2Backend::s_state_swap_lock=PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t Bind2Backend::s_supermaster_config_lock=PTHREAD_MUTEX_INITIALIZER; string Bind2Backend::s_binddirectory; /* when a query comes in, we find the most appropriate zone and answer from that */ @@ -1336,29 +1337,34 @@ BB2DomainInfo &Bind2Backend::createDomain(const string &domain, const string &fi bool Bind2Backend::createSlaveDomain(const string &ip, const string &domain, const string &account) { - // Interference with loadConfig() and DLAddDomainHandler(), use locking - Lock l(&s_state_lock); string filename = getArg("supermaster-destdir")+'/'+domain; L << Logger::Warning << d_logprefix << " Writing bind config zone statement for superslave zone '" << domain << "' from supermaster " << ip << endl; + + { + Lock l2(&s_supermaster_config_lock); - ofstream c_of(getArg("supermaster-config").c_str(), std::ios::app); - if (!c_of) { - L << Logger::Error << "Unable to open supermaster configfile for append: " << stringerror() << endl; - throw DBException("Unable to open supermaster configfile for append: "+stringerror()); + ofstream c_of(getArg("supermaster-config").c_str(), std::ios::app); + if (!c_of) { + L << Logger::Error << "Unable to open supermaster configfile for append: " << stringerror() << endl; + throw DBException("Unable to open supermaster configfile for append: "+stringerror()); + } + + c_of << endl; + c_of << "# Superslave zone " << domain << " (added: " << nowTime() << ") (account: " << account << ')' << endl; + c_of << "zone \"" << domain << "\" {" << endl; + c_of << "\ttype slave;" << endl; + c_of << "\tfile \"" << filename << "\";" << endl; + c_of << "\tmasters { " << ip << "; };" << endl; + c_of << "};" << endl; + c_of.close(); } - - c_of << endl; - c_of << "# Superslave zone " << domain << " (added: " << nowTime() << ") (account: " << account << ')' << endl; - c_of << "zone \"" << domain << "\" {" << endl; - c_of << "\ttype slave;" << endl; - c_of << "\tfile \"" << filename << "\";" << endl; - c_of << "\tmasters { " << ip << "; };" << endl; - c_of << "};" << endl; - c_of.close(); + + // Interference with loadConfig() and DLAddDomainHandler(), use locking + Lock l(&s_state_lock); BB2DomainInfo &bbd = createDomain(canonic(domain), filename); diff --git a/pdns/backends/bind/bindbackend2.hh b/pdns/backends/bind/bindbackend2.hh index 61b7edf1ea..ec578e8e23 100644 --- a/pdns/backends/bind/bindbackend2.hh +++ b/pdns/backends/bind/bindbackend2.hh @@ -181,6 +181,7 @@ public: // for supermaster support bool superMasterBackend(const string &ip, const string &domain, const vector&nsset, string *account, DNSBackend **db); + static pthread_mutex_t s_supermaster_config_lock; bool createSlaveDomain(const string &ip, const string &domain, const string &account);