Skip to content
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...
ahupowerdns committed Feb 6, 2014
1 parent a4f647b commit 3a8a4d68735a0465dff9623c49fb6bf45e0850d8
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
@@ -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");
}
@@ -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
@@ -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

This comment has been minimized.

Copy link
Member Author

commented on 3a8a4d6 Feb 6, 2014

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

Please sign in to comment.
You can’t perform that action at this time.