bool UeberBackend::getDomainInfo(const string &domain, DomainInfo &di)
{
+ check_op_requests();
for(vector<DNSBackend *>::const_iterator i=backends.begin();i!=backends.end();++i)
if((*i)->getDomainInfo(domain, di))
return true;
int UeberBackend::addDomainKey(const string& name, const KeyData& key)
{
int ret;
+ check_op_requests();
BOOST_FOREACH(DNSBackend* db, backends) {
if((ret = db->addDomainKey(name, key)) >= 0)
return ret;
}
bool UeberBackend::getDomainKeys(const string& name, unsigned int kind, std::vector<KeyData>& keys)
{
+ check_op_requests();
BOOST_FOREACH(DNSBackend* db, backends) {
if(db->getDomainKeys(name, kind, keys))
return true;
bool UeberBackend::getDomainMetadata(const string& name, const std::string& kind, std::vector<std::string>& meta)
{
+ check_op_requests();
BOOST_FOREACH(DNSBackend* db, backends) {
if(db->getDomainMetadata(name, kind, meta))
return true;
bool UeberBackend::setDomainMetadata(const string& name, const std::string& kind, const std::vector<std::string>& meta)
{
+ check_op_requests();
BOOST_FOREACH(DNSBackend* db, backends) {
if(db->setDomainMetadata(name, kind, meta))
return true;
bool UeberBackend::activateDomainKey(const string& name, unsigned int id)
{
+ check_op_requests();
BOOST_FOREACH(DNSBackend* db, backends) {
if(db->activateDomainKey(name, id))
return true;
bool UeberBackend::deactivateDomainKey(const string& name, unsigned int id)
{
+ check_op_requests();
BOOST_FOREACH(DNSBackend* db, backends) {
if(db->deactivateDomainKey(name, id))
return true;
bool UeberBackend::removeDomainKey(const string& name, unsigned int id)
{
+ check_op_requests();
BOOST_FOREACH(DNSBackend* db, backends) {
if(db->removeDomainKey(name, id))
return true;
bool UeberBackend::getTSIGKey(const string& name, string* algorithm, string* content)
{
+ check_op_requests();
BOOST_FOREACH(DNSBackend* db, backends) {
if(db->getTSIGKey(name, algorithm, content))
return true;
return true;
}
+/* Called from anywhere to signal a reload of all backend databases */
+void UeberBackend::reload_all()
+{
+ BOOST_FOREACH(UeberBackend* b, instances) {
+ b->cur_op_request = RELOAD;
+ }
+}
+void UeberBackend::rediscover_all()
+{
+ BOOST_FOREACH(UeberBackend* b, instances) {
+ b->cur_op_request = REDISCOVER;
+ }
+}
+/* OPS */
void UeberBackend::reload()
{
for ( vector< DNSBackend * >::iterator i = backends.begin(); i != backends.end(); ++i )
{
string tmpstr;
( *i )->rediscover(&tmpstr);
- if(status)
- *status+=tmpstr + (i!=backends.begin() ? "\n" : "");
}
}
void UeberBackend::getUnfreshSlaveInfos(vector<DomainInfo>* domains)
{
+ check_op_requests();
for ( vector< DNSBackend * >::iterator i = backends.begin(); i != backends.end(); ++i )
{
( *i )->getUnfreshSlaveInfos( domains );
void UeberBackend::getUpdatedMasters(vector<DomainInfo>* domains)
{
+ check_op_requests();
for ( vector< DNSBackend * >::iterator i = backends.begin(); i != backends.end(); ++i )
{
( *i )->getUpdatedMasters( domains );
}
}
+void UeberBackend::check_op_requests()
+{
+ if( !cur_op_request )
+ return;
+
+ switch(cur_op_request) {
+
+ case RELOAD:
+ reload();
+ break;
+
+ case REDISCOVER:
+ rediscover();
+ break;
+
+ default:
+ break;
+ }
+ cur_op_request = NONE;
+}
+
/** special trick - if sd.db is set to -1, the cache is ignored */
bool UeberBackend::getSOA(const string &domain, SOAData &sd, DNSPacket *p)
{
}
}
+ check_op_requests();
for(vector<DNSBackend *>::const_iterator i=backends.begin();i!=backends.end();++i)
if((*i)->getSOA(domain, sd, p)) {
DNSResourceRecord rr;
bool UeberBackend::superMasterBackend(const string &ip, const string &domain, const vector<DNSResourceRecord>&nsset, string *account, DNSBackend **db)
{
+ check_op_requests();
for(vector<DNSBackend *>::const_iterator i=backends.begin();i!=backends.end();++i)
if((*i)->superMasterBackend(ip,domain,nsset,account, db))
return true;
delete d;
}
+void cleanup_backends(UeberBackend *b)
+{
+ for_each(b->backends.begin(),b->backends.end(),del);
+ b->backends.clear();
+}
+
void UeberBackend::cleanup()
{
pthread_mutex_lock(&instances_lock);
pthread_mutex_unlock(&instances_lock);
- for_each(backends.begin(),backends.end(),del);
+ cleanup_backends(this);
}
// silly Solaris fix
void UeberBackend::alsoNotifies(const string &domain, set<string> *ips)
{
+ check_op_requests();
for ( vector< DNSBackend * >::iterator i = backends.begin(); i != backends.end(); ++i )
(*i)->alsoNotifies(domain,ips);
}
stale=true; // please recycle us!
throw PDNSException("We are stale, please recycle");
}
+
+ check_op_requests();
+
+ d_question.qtype=qtype;
+ d_question.qname=qname;
+ d_question.zoneId=zoneId;
+ int cstat=cacheHas(d_question, d_answers);
+ if(cstat<0) { // nothing
+ d_negcached=d_cached=false;
+ d_answers.clear();
+ (d_handle.d_hinterBackend=backends[d_handle.i++])->lookup(qtype, qname,pkt_p,zoneId);
+ }
+ else if(cstat==0) {
+ d_negcached=true;
+ d_cached=false;
+ d_answers.clear();
+ }
else {
- d_question.qtype=qtype;
- d_question.qname=qname;
- d_question.zoneId=zoneId;
- int cstat=cacheHas(d_question, d_answers);
- if(cstat<0) { // nothing
- d_negcached=d_cached=false;
- d_answers.clear();
- (d_handle.d_hinterBackend=backends[d_handle.i++])->lookup(qtype, qname,pkt_p,zoneId);
- }
- else if(cstat==0) {
- d_negcached=true;
- d_cached=false;
- d_answers.clear();
- }
- else {
- d_negcached=false;
- d_cached=true;
- d_cachehandleiter = d_answers.begin();
- }
+ d_negcached=false;
+ d_cached=true;
+ d_cachehandleiter = d_answers.begin();
}
d_handle.parent=this;
}
void UeberBackend::getAllDomains(vector<DomainInfo> *domains) {
+ check_op_requests();
for (vector<DNSBackend*>::iterator i = backends.begin(); i != backends.end(); ++i )
{
(*i)->getAllDomains(domains);
}
return false;
}
+
+ /* Don't check_op_requests - don't reload a backend in the middle of a zone fetch operation */
if(!d_handle.get(rr)) {
if(!d_ancount && !d_handle.qname.empty()) // don't cache axfr
addNegCache(d_question);