safePutBBDomainInfo(bbd);
}
-void Bind2Backend::setFresh(uint32_t domain_id)
+void Bind2Backend::setLastCheck(uint32_t domain_id, time_t lastcheck)
{
BB2DomainInfo bbd;
if (safeGetBBDomainInfo(domain_id, &bbd)) {
- bbd.d_lastcheck = time(nullptr);
+ bbd.d_lastcheck = lastcheck;
safePutBBDomainInfo(bbd);
}
}
+void Bind2Backend::setStale(uint32_t domain_id)
+{
+ setLastCheck(domain_id, 0);
+}
+
+void Bind2Backend::setFresh(uint32_t domain_id)
+{
+ setLastCheck(domain_id, time(nullptr));
+}
+
bool Bind2Backend::startTransaction(const DNSName& qname, int id)
{
if (id < 0) {
static DNSBackend* maker();
static std::mutex s_startup_lock;
+ void setStale(uint32_t domain_id) override;
void setFresh(uint32_t domain_id) override;
void setNotified(uint32_t id, uint32_t serial) override;
bool startTransaction(const DNSName& qname, int id) override;
static bool safeRemoveBBDomainInfo(const DNSName& name);
shared_ptr<SSQLite3> d_dnssecdb;
bool getNSEC3PARAM(const DNSName& name, NSEC3PARAMRecordContent* ns3p);
+ void setLastCheck(uint32_t domain_id, time_t lastcheck);
class handle
{
public:
});
}
+void LMDBBackend::setStale(uint32_t domain_id)
+{
+ genChangeDomain(domain_id, [](DomainInfo& di) {
+ di.last_check = 0;
+ });
+}
+
void LMDBBackend::setFresh(uint32_t domain_id)
{
genChangeDomain(domain_id, [](DomainInfo& di) {
}
bool setDomainMetadata(const DNSName& name, const std::string& kind, const std::vector<std::string>& meta) override;
+ void setStale(uint32_t domain_id) override;
void setFresh(uint32_t domain_id) override;
void setNotified(uint32_t id, uint32_t serial) override;
bool setAccount(const DNSName& domain, const std::string& account) override;
req.preparePost();
verb = "PATCH";
}
+ else if (method == "setStale") {
+ req.preparePost();
+ verb = "PATCH";
+ }
else if (method == "setFresh") {
req.preparePost();
verb = "PATCH";
}
}
+void RemoteBackend::setStale(uint32_t domain_id)
+{
+ Json query = Json::object{
+ {"method", "setStale"},
+ {"parameters", Json::object{{"id", static_cast<double>(domain_id)}}}};
+
+ Json answer;
+ if (this->send(query) == false || this->recv(answer) == false) {
+ g_log << Logger::Error << kBackendId << " Failed to execute RPC for RemoteBackend::setStale(" << domain_id << ")" << endl;
+ }
+}
+
void RemoteBackend::setFresh(uint32_t domain_id)
{
Json query = Json::object{
void getUpdatedMasters(vector<DomainInfo>* domains) override;
void alsoNotifies(const DNSName& domain, set<string>* ips) override;
void getUnfreshSlaveInfos(vector<DomainInfo>* domains) override;
+ void setStale(uint32_t domain_id) override;
void setFresh(uint32_t domain_id) override;
static DNSBackend* maker();
}
}
-void GSQLBackend::setFresh(uint32_t domain_id)
+void GSQLBackend::setLastCheck(uint32_t domain_id, time_t lastcheck)
{
try {
reconnectIfNeeded();
- d_UpdateLastCheckOfZoneQuery_stmt->
- bind("last_check", time(nullptr))->
- bind("domain_id", domain_id)->
- execute()->
- reset();
+ d_UpdateLastCheckOfZoneQuery_stmt->bind("last_check", lastcheck)->bind("domain_id", domain_id)->execute()->reset();
}
catch (SSqlException &e) {
- throw PDNSException("GSQLBackend unable to refresh domain_id "+itoa(domain_id)+": "+e.txtReason());
+ throw PDNSException("GSQLBackend unable to update last_check for domain_id " + itoa(domain_id) + ": " + e.txtReason());
}
}
+void GSQLBackend::setStale(uint32_t domain_id)
+{
+ setLastCheck(domain_id, 0);
+}
+
+void GSQLBackend::setFresh(uint32_t domain_id)
+{
+ setLastCheck(domain_id, time(nullptr));
+}
+
bool GSQLBackend::setMasters(const DNSName &domain, const vector<ComboAddress> &masters)
{
vector<string> masters_s;
bool deleteDomain(const DNSName &domain) override;
bool superMasterAdd(const string &ip, const string &nameserver, const string &account) override;
bool superMasterBackend(const string &ip, const DNSName &domain, const vector<DNSResourceRecord>&nsset, string *nameserver, string *account, DNSBackend **db) override;
+ void setStale(uint32_t domain_id) override;
void setFresh(uint32_t domain_id) override;
void getUnfreshSlaveInfos(vector<DomainInfo> *domains) override;
void getUpdatedMasters(vector<DomainInfo> *updatedDomains) override;
string pattern2SQLPattern(const string& pattern);
void extractRecord(SSqlStatement::row_t& row, DNSResourceRecord& rr);
void extractComment(SSqlStatement::row_t& row, Comment& c);
+ void setLastCheck(uint32_t domain_id, time_t lastcheck);
bool isConnectionUsable() {
if (d_db) {
return d_db->isConnectionUsable();
virtual void getUpdatedMasters(vector<DomainInfo>* domains)
{
}
-
+
+ //! Called by PowerDNS to inform a backend that a domain need to be checked for freshness
+ virtual void setStale(uint32_t domain_id)
+ {
+ }
+
//! Called by PowerDNS to inform a backend that a domain has been checked for freshness
virtual void setFresh(uint32_t domain_id)
{
-
}
+
//! Called by PowerDNS to inform a backend that the changes in the domain have been reported to slaves
virtual void setNotified(uint32_t id, uint32_t serial)
{
} else if (newCount % 10 == 0) {
g_log<<Logger::Notice<<"Unable to retrieve SOA for "<<di.zone<<", this was the "<<std::to_string(newCount)<<"th time. Skipping SOA checks until "<<nextCheck<<endl;
}
+ // Make sure we recheck SOA for notifies
+ if (di.receivedNotify) {
+ di.backend->setStale(di.id);
+ }
continue;
}