]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
should fix #1662, reloading while checking for domains that need to be notified in... 1673/head
authorbert hubert <bert.hubert@netherlabs.nl>
Tue, 19 Aug 2014 11:12:10 +0000 (13:12 +0200)
committerbert hubert <bert.hubert@netherlabs.nl>
Tue, 19 Aug 2014 11:12:10 +0000 (13:12 +0200)
modules/bindbackend/bindbackend2.cc

index 0e934e136f96a133224234fe3f85e1bcf87fa862..41093ad278f547f11369c1faf947ac8cacbd161d 100644 (file)
@@ -290,41 +290,43 @@ bool Bind2Backend::feedRecord(const DNSResourceRecord &r, string *ordername)
 
 void Bind2Backend::getUpdatedMasters(vector<DomainInfo> *changedDomains)
 {
-  vector<BB2DomainInfo> toPut;
+  vector<DomainInfo> consider;
   {
     ReadLock rl(&s_state_lock);
-    SOAData soadata;
 
     for(state_t::const_iterator i = s_state.begin(); i != s_state.end() ; ++i) {
       if(!i->d_masters.empty() && this->alsoNotify.empty() && i->d_also_notify.empty())
        continue;
-      soadata.serial=0;
-      try {
-       this->getSOA(i->d_name, soadata); // we might not *have* a SOA yet, but this might trigger a load of it
-      }
-      catch(...){}
+    
       DomainInfo di;
       di.id=i->d_id;
-      di.serial=soadata.serial;
+
       di.zone=i->d_name;
       di.last_check=i->d_lastcheck;
+      di.notified_serial = i->d_lastnotified;
       di.backend=this;
       di.kind=DomainInfo::Master;
       if(!i->d_lastnotified)  {          // don't do notification storm on startup 
-       // what if i->first is new??
-       BB2DomainInfo bbd;
-       if(safeGetBBDomainInfo(i->d_id, &bbd)) { // we hold a readlock, so this is fine
-         bbd.d_lastnotified=soadata.serial; 
-         toPut.push_back(bbd);                  // but we can't write yet
-       }
+       consider.push_back(di);
       }
-      else
-       if(soadata.serial != i->d_lastnotified)
-         changedDomains->push_back(di);
     }
   }
-  BOOST_FOREACH(BB2DomainInfo& bbd, toPut) {
-    safePutBBDomainInfo(bbd);
+
+  SOAData soadata;
+  BOOST_FOREACH(DomainInfo& di, consider) {
+    soadata.serial=0;
+    try {
+      this->getSOA(di.zone, soadata); // we might not *have* a SOA yet, but this might trigger a load of it
+    }
+    catch(...){}
+    BB2DomainInfo bbd;
+    if(safeGetBBDomainInfo(di.id, &bbd)) { 
+      bbd.d_lastnotified=soadata.serial; 
+      safePutBBDomainInfo(bbd);
+    }
+    di.serial=soadata.serial;    
+    if(soadata.serial != di.notified_serial)
+      changedDomains->push_back(di);
   }
 }