]> granicus.if.org Git - pdns/commitdiff
requeue serial check if NOTIFY comes in while incoming AXFR is ongoing
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Thu, 12 Apr 2018 18:33:41 +0000 (20:33 +0200)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 13 Apr 2018 11:14:40 +0000 (13:14 +0200)
(cherry picked from commit 7d4ac70c97fffe7916ef8b8585dd9552c9a59517)

pdns/communicator.cc
pdns/slavecommunicator.cc

index e73eecb8ff655ffd82694d21ac87cec82b55b102..7db5a3e5b6737a2368059311400d8bd115e95bf5 100644 (file)
@@ -125,8 +125,17 @@ void CommunicatorClass::mainloop(void)
       while(time(0) < next) {
         rc=d_any_sem.tryWait();
 
-        if(rc)
+        if(rc) {
+          bool extraSlaveRefresh = false;
           Utility::sleep(1);
+          {
+            Lock l(&d_lock);
+            if (d_tocheck.size())
+              extraSlaveRefresh = true;
+          }
+          if (extraSlaveRefresh)
+            slaveRefresh(&P);
+        }
         else { 
           break; // something happened
         }
index 732699024db143c03e8ceee16f95f5a3def09aed..4e05ed2bbee37f8a8a5e5af3ee239cd1b751e036 100644 (file)
@@ -735,8 +735,20 @@ void CommunicatorClass::slaveRefresh(PacketHandler *P)
 
   {
     Lock l(&d_lock);
-    rdomains.insert(rdomains.end(), d_tocheck.begin(), d_tocheck.end());
-    d_tocheck.clear();
+
+    set<DomainInfo> requeue;
+    for(const auto& di: d_tocheck) {
+      if(d_inprogress.count(di.zone)) {
+        g_log<<Logger::Debug<<"Got NOTIFY for "<<di.zone<<" while AXFR in progress, requeueing SOA check"<<endl;
+        requeue.insert(di);
+      }
+      else {
+        g_log<<Logger::Debug<<"Got NOTIFY for "<<di.zone<<", going to check SOA serial"<<endl;
+        rdomains.push_back(di);
+      }
+    }
+    d_tocheck.swap(requeue);
+
     trysuperdomains.insert(trysuperdomains.end(), d_potentialsupermasters.begin(), d_potentialsupermasters.end());
     d_potentialsupermasters.clear();
   }