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::getAllDomainMetadata(const string& name, std::map<std::string, std::vector<std::string> >& meta)
{
- check_op_requests();
BOOST_FOREACH(DNSBackend* db, backends) {
if(db->getAllDomainMetadata(name, meta))
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 false;
}
-/* 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;
-}
-
bool UeberBackend::getAuth(DNSPacket *p, SOAData *sd, const string &target, int *zoneId)
{
int best_match_len = -1;
bool from_cache = false; // Was this result fetched from the cache?
- check_op_requests();
-
// If not special case of caching explicitly disabled (sd->db = -1), first
// find the best match from the cache. If DS then we need to find parent so
// dont bother with caching as it confuses matters.
}
}
- check_op_requests();
for(vector<DNSBackend *>::const_iterator i=backends.begin();i!=backends.end();++i)
if((*i)->getSOA(domain, sd, p)) {
if( d_cache_ttl ) {
bool UeberBackend::superMasterBackend(const string &ip, const string &domain, const vector<DNSResourceRecord>&nsset, string *nameserver, 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, nameserver, account, db))
return true;
pthread_mutex_lock(&instances_lock);
instances.push_back(this); // report to the static list of ourself
pthread_mutex_unlock(&instances_lock);
- cur_op_request = NONE;
d_cache_ttl = ::arg().asNum("query-cache-ttl");
d_negcache_ttl = ::arg().asNum("negquery-cache-ttl");
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);
- cleanup_backends(this);
+ for_each(backends.begin(),backends.end(),del);
}
// 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_negcached=false;
- d_cached=true;
- d_cachehandleiter = d_answers.begin();
+ 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_handle.parent=this;
}
void UeberBackend::getAllDomains(vector<DomainInfo> *domains, bool include_disabled) {
- check_op_requests();
for (vector<DNSBackend*>::iterator i = backends.begin(); i != backends.end(); ++i )
{
(*i)->getAllDomains(domains, include_disabled);
}
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);