]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
also do not re-poll domains for freshness when already in the AXFR queue
authorBert Hubert <bert.hubert@netherlabs.nl>
Tue, 6 Jul 2010 08:22:06 +0000 (08:22 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Tue, 6 Jul 2010 08:22:06 +0000 (08:22 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/tags/pdns-2-9-22-x@1667 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/communicator.hh
pdns/slavecommunicator.cc

index 1099ad6823306a19d350e5b1d5a4da1c826a4309..7150b75236ebd1055348f34c735f973298e895ef 100644 (file)
@@ -30,7 +30,7 @@
 #include <boost/multi_index/sequenced_index.hpp>
 using namespace boost::multi_index;
 
-#ifndef WIN32
+#ifndef WIN32 
 # include <unistd.h>
 # include <fcntl.h>
 # include <netdb.h>
@@ -51,11 +51,13 @@ struct SuckRequest
   }
 };
 
+struct IDTag{};
+
 typedef multi_index_container<
   SuckRequest,
   indexed_by<
     sequenced<>,
-    ordered_unique<identity<SuckRequest> >
+    ordered_unique<tag<IDTag>, identity<SuckRequest> >
   >
 > UniQueue;
 
index b8d57d1e6fdff475136df2d21b2e54a130638b31..5e56d20c2a13fbf4705e632c39d0ecd118dd7d11 100644 (file)
@@ -162,20 +162,40 @@ struct SlaveSenderReceiver
 void CommunicatorClass::slaveRefresh(PacketHandler *P)
 {
   UeberBackend *B=dynamic_cast<UeberBackend *>(P->getBackend());
-  vector<DomainInfo> sdomains;
-  B->getUnfreshSlaveInfos(&sdomains);
+  vector<DomainInfo> sdomains, rdomains;
+  B->getUnfreshSlaveInfos(&rdomains);
+  
+  {
+    Lock l(&d_lock);
+    typedef UniQueue::index<IDTag>::type domains_by_name_t;
+    domains_by_name_t& nameindex=boost::multi_index::get<IDTag>(d_suckdomains);
+
+    // remove unfresh domains already queued for AXFR, no sense polling them again
+    BOOST_FOREACH(DomainInfo& di, rdomains) {
+      SuckRequest sr;
+      sr.domain=di.zone;
+      sr.master=*di.masters.begin();
+      if(nameindex.count(sr))
+        continue;
+      sdomains.push_back(di);
+    }
+//    cerr<<rdomains.size() - sdomains.size()<<" prevented"<<endl;  
+  }
+  
   if(sdomains.empty())
   {
-    if(d_slaveschanged)
-      L<<Logger::Warning<<"All slave domains are fresh"<<endl;
-    d_slaveschanged=false;
+    if(d_slaveschanged) {
+      Lock l(&d_lock);
+      L<<Logger::Warning<<"No new unfresh slave domains, "<<d_suckdomains.size()<<" queued for AXFR already"<<endl;
+    }
+    d_slaveschanged = !rdomains.empty();
     return;
   }
   else {
     Lock l(&d_lock);
     L<<Logger::Warning<<sdomains.size()<<" slave domain"<<(sdomains.size()>1 ? "s" : "")<<" need"<<
       (sdomains.size()>1 ? "" : "s")<<
-      " checking, "<<d_suckdomains.size()<<" queued"<<endl;
+      " checking, "<<d_suckdomains.size()<<" queued for AXFR"<<endl;
   }
       
   SlaveSenderReceiver ssr;