]> granicus.if.org Git - pdns/commitdiff
rec: Fix ACL and domain map updates in the handler thread
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 3 May 2018 14:16:25 +0000 (15:16 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 16 May 2018 15:22:02 +0000 (17:22 +0200)
pdns/pdns_recursor.cc
pdns/syncres.hh

index 6769a5cd267dde1bdc5edfe52413514853774814..d0f68a5ca0a3a9295a36ea51f8b17f279ade4f3b 100644 (file)
@@ -2435,7 +2435,7 @@ struct ThreadMSG
   bool wantAnswer;
 };
 
-void broadcastFunction(const pipefunc_t& func, bool skipSelf)
+void broadcastFunction(const pipefunc_t& func)
 {
   /* This function might be called by the worker with t_id 0 during startup */
   if (t_id != s_handlerThreadID && t_id != s_distributorThreadID) {
@@ -2443,12 +2443,14 @@ void broadcastFunction(const pipefunc_t& func, bool skipSelf)
     exit(1);
   }
 
+  // call the function ourselves, to update the ACL or domain maps for example
+  func();
+
   int n = 0;
   for(ThreadPipeSet& tps : g_pipes)
   {
     if(n++ == t_id) {
-      if(!skipSelf)
-        func(); // don't write to ourselves!
+      func(); // don't write to ourselves!
       continue;
     }
 
@@ -2563,7 +2565,7 @@ vector<pair<DNSName, uint16_t> >& operator+=(vector<pair<DNSName, uint16_t> >&a,
 }
 
 
-template<class T> T broadcastAccFunction(const boost::function<T*()>& func, bool skipSelf)
+template<class T> T broadcastAccFunction(const boost::function<T*()>& func)
 {
   if (t_id != s_handlerThreadID) {
     g_log<<Logger::Error<<"broadcastFunction has been called by a worker ("<<t_id<<")"<<endl;
@@ -2596,10 +2598,10 @@ template<class T> T broadcastAccFunction(const boost::function<T*()>& func, bool
   return ret;
 }
 
-template string broadcastAccFunction(const boost::function<string*()>& fun, bool skipSelf); // explicit instantiation
-template uint64_t broadcastAccFunction(const boost::function<uint64_t*()>& fun, bool skipSelf); // explicit instantiation
-template vector<ComboAddress> broadcastAccFunction(const boost::function<vector<ComboAddress> *()>& fun, bool skipSelf); // explicit instantiation
-template vector<pair<DNSName,uint16_t> > broadcastAccFunction(const boost::function<vector<pair<DNSName, uint16_t> > *()>& fun, bool skipSelf); // explicit instantiation
+template string broadcastAccFunction(const boost::function<string*()>& fun); // explicit instantiation
+template uint64_t broadcastAccFunction(const boost::function<uint64_t*()>& fun); // explicit instantiation
+template vector<ComboAddress> broadcastAccFunction(const boost::function<vector<ComboAddress> *()>& fun); // explicit instantiation
+template vector<pair<DNSName,uint16_t> > broadcastAccFunction(const boost::function<vector<pair<DNSName, uint16_t> > *()>& fun); // explicit instantiation
 
 static void handleRCC(int fd, FDMultiplexer::funcparam_t& var)
 {
index b1fc80c0981d4a38231ea279c0d505c49141e5d1..d912e95949a06d20bbd7dfd83ec8f12a275630d4 100644 (file)
@@ -979,12 +979,12 @@ std::string reloadAuthAndForwards();
 ComboAddress parseIPAndPort(const std::string& input, uint16_t port);
 ComboAddress getQueryLocalAddress(int family, uint16_t port);
 typedef boost::function<void*(void)> pipefunc_t;
-void broadcastFunction(const pipefunc_t& func, bool skipSelf = false);
+void broadcastFunction(const pipefunc_t& func);
 void distributeAsyncFunction(const std::string& question, const pipefunc_t& func);
 
 int directResolve(const DNSName& qname, const QType& qtype, int qclass, vector<DNSRecord>& ret);
 
-template<class T> T broadcastAccFunction(const boost::function<T*()>& func, bool skipSelf=false);
+template<class T> T broadcastAccFunction(const boost::function<T*()>& func);
 
 std::shared_ptr<SyncRes::domainmap_t> parseAuthAndForwards();
 uint64_t* pleaseGetNsSpeedsSize();