From 85c32340b104192578cf209e92562a3f62a8456e Mon Sep 17 00:00:00 2001 From: Bert Hubert Date: Mon, 1 Feb 2010 21:54:44 +0000 Subject: [PATCH] implement explicit (configurable) limit to number of mthreads - we are usually implicitly limited, this is no change of behaviour for almost all setups git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1505 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- pdns/pdns_recursor.cc | 23 +++++++++++++++++++++++ pdns/syncres.hh | 1 + 2 files changed, 24 insertions(+) diff --git a/pdns/pdns_recursor.cc b/pdns/pdns_recursor.cc index 6f338f6cc..dedeac933 100644 --- a/pdns/pdns_recursor.cc +++ b/pdns/pdns_recursor.cc @@ -106,6 +106,7 @@ string s_programname="pdns_recursor"; typedef vector tcpListenSockets_t; tcpListenSockets_t g_tcpListenSockets; // shared across threads, but this is fine, never written to from a thread. All threads listen on all sockets int g_tcpTimeout; +unsigned int g_maxMThreads; struct timeval g_now; // timestamp, updated (too) frequently map g_listenSocketsAddresses; // is shared across all threads right now @@ -749,6 +750,12 @@ void handleNewTCPQuestion(int fd, FDMultiplexer::funcparam_t& ) socklen_t addrlen=sizeof(addr); int newsock=(int)accept(fd, (struct sockaddr*)&addr, &addrlen); if(newsock>0) { + if(MT->numProcesses() > g_maxMThreads) { + g_stats.overCapacityDrops++; + Utility::closesocket(newsock); + return; + } + g_stats.addRemote(addr); if(t_allowFrom && !t_allowFrom->match(&addr)) { if(!g_quiet) @@ -787,7 +794,9 @@ void handleNewUDPQuestion(int fd, FDMultiplexer::funcparam_t& var) ComboAddress fromaddr; socklen_t addrlen=sizeof(fromaddr); + if((len=recvfrom(fd, data, sizeof(data), 0, (sockaddr *)&fromaddr, &addrlen)) >= 0) { + g_stats.addRemote(fromaddr); if(t_allowFrom && !t_allowFrom->match(&fromaddr)) { @@ -824,6 +833,11 @@ void handleNewUDPQuestion(int fd, FDMultiplexer::funcparam_t& var) catch(std::exception& e) { throw MOADNSException(e.what()); // translate } + if(MT->numProcesses() > g_maxMThreads) { + g_stats.overCapacityDrops++; + return; + } + DNSComboWriter* dc = new DNSComboWriter(data, len, g_now); dc->setSocket(fd); dc->setRemote(&fromaddr); @@ -1528,6 +1542,13 @@ int serviceMain(int argc, char*argv[]) L<