Permalink
Browse files

make sure we don't exceed the number of available filedescriptors for…

… mthreads. You can still overshoot a little bit, but not all mthreads will be using an fd.
  • Loading branch information...
1 parent a4f647b commit 3a8a4d68735a0465dff9623c49fb6bf45e0850d8 @ahupowerdns ahupowerdns committed Feb 6, 2014
Showing with 39 additions and 2 deletions.
  1. +21 −1 pdns/misc.cc
  2. +3 −0 pdns/misc.hh
  3. +15 −1 pdns/pdns_recursor.cc
View
@@ -1,6 +1,6 @@
/*
PowerDNS Versatile Database Driven Nameserver
- Copyright (C) 2002 - 2010 PowerDNS.COM BV
+ Copyright (C) 2002 - 2014 PowerDNS.COM BV
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2
@@ -24,6 +24,7 @@
#include <netdb.h>
#include <sys/time.h>
#include <time.h>
+#include <sys/resource.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <unistd.h>
@@ -816,3 +817,22 @@ void addCMsgSrcAddr(struct msghdr* msgh, void* cmsgbuf, ComboAddress* source)
msgh->msg_controllen = cmsg->cmsg_len;
}
}
+
+unsigned int getFilenumLimit(bool hardOrSoft)
+{
+ struct rlimit rlim;
+ if(getrlimit(RLIMIT_NOFILE, &rlim) < 0)
+ unixDie("Requesting number of available file descriptors");
+ return hardOrSoft ? rlim.rlim_max : rlim.rlim_cur;
+}
+
+void setFilenumLimit(unsigned int lim)
+{
+ struct rlimit rlim;
+
+ if(getrlimit(RLIMIT_NOFILE, &rlim) < 0)
+ unixDie("Requesting number of available file descriptors");
+ rlim.rlim_cur=lim;
+ if(setrlimit(RLIMIT_NOFILE, &rlim) < 0)
+ unixDie("Setting number of available file descriptors");
+}
View
@@ -504,4 +504,7 @@ private:
union ComboAddress;
void addCMsgSrcAddr(struct msghdr* msgh, void* cmsgbuf, ComboAddress* source);
+
+unsigned int getFilenumLimit(bool hardOrSoft=0);
+void setFilenumLimit(unsigned int lim);
#endif
View
@@ -1850,7 +1850,21 @@ int serviceMain(int argc, char*argv[])
g_tcpTimeout=::arg().asNum("client-tcp-timeout");
g_maxTCPPerClient=::arg().asNum("max-tcp-per-client");
- g_maxMThreads=::arg().asNum("max-mthreads");
+ g_maxMThreads=::arg().asNum("max-mthreads");
+ unsigned int availFDs=getFilenumLimit();
+ if(g_maxMThreads * g_numThreads > availFDs) {
+ if(getFilenumLimit(true) >= g_maxMThreads * g_numThreads) {
+ setFilenumLimit(g_maxMThreads * g_numThreads);
+ L<<Logger::Warning<<"Raised soft limit on number of filedescriptors to "<<g_maxMThreads * g_numThreads<<" to match max-mthreads and threads settings"<<endl;
+ }
+ else {
+ int newval = getFilenumLimit(true) / g_numThreads;
+ L<<Logger::Warning<<"Insufficient number of filedescriptors available for max-mthreads*threads setting! ("<<availFDs<<" < "<<g_maxMThreads*g_numThreads<<"), reducing max-mthreads to "<<newval<<endl;
+ g_maxMThreads = newval;
+ }
+
+
+ }
if(g_numThreads == 1) {
L<<Logger::Warning<<"Operating unthreaded"<<endl;

1 comment on commit 3a8a4d6

@ahupowerdns
Member

If you apply this patch, apply the next one too! This patch is INCOMPLETE. 6b149d0

Please sign in to comment.