]> granicus.if.org Git - pdns/commitdiff
Allow setting maxOustanding and maxTCPClientThreads in configuration
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 4 Dec 2015 15:01:40 +0000 (16:01 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 4 Dec 2015 15:01:40 +0000 (16:01 +0100)
This commit adds the setMaxTCPClientThreads() and
setMaxUDPOutstanding() directives.
These controls, respectively, the maximum number of TCP threads
handling client connections and the maximum number of oustanding
UDP queries to a given backend server.
setMaxUDPOutstanding() is only usable at configuration-time, and
not at runtime.

pdns/README-dnsdist.md
pdns/dnsdist-lua.cc
pdns/dnsdist.cc
pdns/dnsdist.hh

index 0bf1b8b52bf1ca7c47bb02a4e6d36a004e6ae0fb..b5366c397ab878b0f4196a2175a1b1cf185ab882 100644 (file)
@@ -671,6 +671,11 @@ instantiate a server with additional parameters
      * newSuffixMatchNode(): returns a new SuffixMatchNode
      * member `check(DNSName)`: returns true if DNSName is matched by this group
      * member `add(DNSName)`: add this DNSName to the node
+ * Tuning related:
+   * setTCPRecvTimeout(n): set the read timeout on TCP connections from the client, in seconds.
+   * setTCPSendTimeout(n): set the write timeout on TCP connections from the client, in seconds.
+   * setMaxTCPClientThreads(n): set the maximum of TCP client threads, handling TCP connections.
+   * setMaxUDPOutstanding(n): set the maximum number of outstanding UDP queries to a given backend server. This can only be set at configuration time.
 
 All hooks
 ---------
index 0b99313424547f7122bccd0768587cec35b5eec2..edc1ea216f6dfae816e242129641c47419a9a677 100644 (file)
@@ -897,6 +897,16 @@ vector<std::function<void(void)>> setupLua(bool client, const std::string& confi
 
   g_lua.writeFunction("setTCPSendTimeout", [](int timeout) { g_tcpSendTimeout=timeout; });
 
+  g_lua.writeFunction("setMaxUDPOutstanding", [](uint16_t max) {
+      if (!g_configurationDone) {
+        g_maxOutstanding = max;
+      } else {
+        g_outputBuffer="Max UDP outstanding cannot be altered at runtime!\n";
+      }
+    });
+
+  g_lua.writeFunction("setMaxTCPClientThreads", [](uint64_t max) { g_maxTCPClientThreads = max; });
+
   g_lua.writeFunction("dumpStats", [] {
       vector<string> leftcolumn, rightcolumn;
 
index e19035d631926e0b47e8af4ac289ee39d15715bc..4dd205a59d3316408b009ea7d5709db4cbaf6d7d 100644 (file)
@@ -654,6 +654,8 @@ catch(...)
   return false;
 }
 
+std::atomic<uint64_t> g_maxTCPClientThreads{10};
+
 void* maintThread()
 {
   int interval = 1;
@@ -661,7 +663,7 @@ void* maintThread()
   for(;;) {
     sleep(interval);
 
-    if(g_tcpclientthreads.d_queued > 1 && g_tcpclientthreads.d_numthreads < 10)
+    if(g_tcpclientthreads.d_queued > 1 && g_tcpclientthreads.d_numthreads < g_maxTCPClientThreads)
       g_tcpclientthreads.addTCPClientThread();
 
     for(auto& dss : g_dstates.getCopy()) { // this points to the actual shared_ptrs!
@@ -1053,7 +1055,8 @@ char* my_generator(const char* text, int state)
   vector<string> words{"showRules()", "shutdown()", "rmRule(", "mvRule(", "addACL(", "addLocal(", "setServerPolicy(", "setServerPolicyLua(",
       "newServer(", "rmServer(", "showServers()", "show(", "newDNSName(", "newSuffixMatchNode(", "controlSocket(", "topClients(", "showResponseLatency()", 
       "newQPSLimiter(", "makeKey()", "setKey(", "testCrypto()", "addAnyTCRule()", "showServerPolicy()", "setACL(", "showACL()", "addDomainBlock(", 
-      "addPoolRule(", "addQPSLimit(", "topResponses(", "topQueries(", "topRule()", "setDNSSECPool(", "addDelay("};
+      "addPoolRule(", "addQPSLimit(", "topResponses(", "topQueries(", "topRule()", "setDNSSECPool(", "addDelay(",
+      "setMaxUDPOutstanding(", "setMaxTCPClientThreads("};
   static int s_counter=0;
   int counter=0;
   if(!state)
@@ -1096,6 +1099,7 @@ struct
   string gid;
 } g_cmdLine;
 
+std::atomic<bool> g_configurationDone{false};
 
 int main(int argc, char** argv)
 try
@@ -1244,6 +1248,8 @@ try
     g_locals.push_back({ComboAddress("127.0.0.1", 53), true});
   
 
+  g_configurationDone = true;
+
   vector<ClientState*> toLaunch;
   for(const auto& local : g_locals) {
     ClientState* cs = new ClientState;
index 54e56e64fc994c0853213a2a3ff47c8268e8f8eb..537d34ed6225196410ce1879baccb495dfda578f 100644 (file)
@@ -361,6 +361,9 @@ extern std::string g_key; // in theory needs locking
 extern bool g_truncateTC;
 extern int g_tcpRecvTimeout;
 extern int g_tcpSendTimeout;
+extern uint16_t g_maxOutstanding;
+extern std::atomic<bool> g_configurationDone;
+extern std::atomic<uint64_t> g_maxTCPClientThreads;
 struct dnsheader;
 
 void controlThread(int fd, ComboAddress local);