diff --git a/src/Xrd/XrdConfig.cc b/src/Xrd/XrdConfig.cc index 1adafa23757..448543d52e4 100644 --- a/src/Xrd/XrdConfig.cc +++ b/src/Xrd/XrdConfig.cc @@ -847,8 +847,8 @@ int XrdConfig::setFDL() // Set the limit to the maximum allowed // - if (rlim.rlim_max == RLIM_INFINITY) rlim.rlim_max = maxFD; - rlim.rlim_cur = rlim.rlim_max; + if (rlim.rlim_max == RLIM_INFINITY) rlim.rlim_cur = maxFD; + else rlim.rlim_cur = rlim.rlim_max; #if (defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_5)) if (rlim.rlim_cur > OPEN_MAX) rlim.rlim_max = rlim.rlim_cur = OPEN_MAX; #endif diff --git a/src/Xrd/XrdScheduler.cc b/src/Xrd/XrdScheduler.cc index ce89acf65c4..4a5dae63375 100644 --- a/src/Xrd/XrdScheduler.cc +++ b/src/Xrd/XrdScheduler.cc @@ -141,10 +141,13 @@ XrdScheduler::XrdScheduler(XrdSysError *eP, XrdOucTrace *tP, // if (!getrlimit(RLIMIT_NPROC, &rlim)) {if (rlim.rlim_max == RLIM_INFINITY || rlim.rlim_max > theMax) - rlim.rlim_max = theMax; - if (rlim.rlim_cur != rlim.rlim_max) - {rlim.rlim_cur = rlim.rlim_max; + {rlim.rlim_cur = theMax; setrlimit(RLIMIT_NPROC, &rlim); + } else { + if (rlim.rlim_cur != rlim.rlim_max) + {rlim.rlim_cur = rlim.rlim_max; + setrlimit(RLIMIT_NPROC, &rlim); + } } } diff --git a/src/XrdOss/XrdOssConfig.cc b/src/XrdOss/XrdOssConfig.cc index 25ca80d6c22..6300d6141ed 100644 --- a/src/XrdOss/XrdOssConfig.cc +++ b/src/XrdOss/XrdOssConfig.cc @@ -241,6 +241,7 @@ int XrdOssSys::Configure(const char *configfn, XrdSysError &Eroute, char *val; int retc, NoGo = XrdOssOK; pthread_t tid; + bool setfd = false; // Do the herald thing // @@ -255,16 +256,27 @@ int XrdOssSys::Configure(const char *configfn, XrdSysError &Eroute, // Establish the FD limit and the fence (half way) // if (getrlimit(RLIMIT_NOFILE, &rlim)) - Eroute.Emsg("Config", errno, "get fd limit"); - else {if (rlim.rlim_max == RLIM_INFINITY) rlim.rlim_max = maxFD; - if (rlim.rlim_cur != rlim.rlim_max) - {rlim.rlim_cur = rlim.rlim_max; - if (setrlimit(RLIMIT_NOFILE, &rlim)) + {Eroute.Emsg("Config", errno, "get fd limit"); + rlim.rlim_cur = maxFD; + } + else {if (rlim.rlim_max == RLIM_INFINITY) + {rlim.rlim_cur = maxFD; + setfd = true; + } else { + if (rlim.rlim_cur != rlim.rlim_max) + {rlim.rlim_cur = rlim.rlim_max; + setfd = true; + } + } + if (setfd) + {if (setrlimit(RLIMIT_NOFILE, &rlim)) Eroute.Emsg("Config", errno, "set fd limit"); else FDLimit = rlim.rlim_cur; } else {FDFence = static_cast(rlim.rlim_cur)>>1; FDLimit = rlim.rlim_cur; } + } + if (FDFence < 0 || FDFence >= FDLimit) FDFence = FDLimit >> 1; // Process the configuration file // @@ -277,16 +289,6 @@ int XrdOssSys::Configure(const char *configfn, XrdSysError &Eroute, if (STT_Lib && !NoGo) NoGo |= ConfigStatLib(Eroute, envP); } -// Establish the FD limit -// - if (FDLimit <= 0) FDLimit = rlim.rlim_cur; - else {rlim.rlim_cur = FDLimit; - if (setrlimit(RLIMIT_NOFILE, &rlim) < 0) - NoGo = Eroute.Emsg("Config", errno,"set FD limit"); - } - if (FDFence < 0 || FDFence >= FDLimit) FDFence = FDLimit >> 1; - } - // Establish usage tracking and quotas, if need be. Note that if we are not // a true data server, those services will be initialized but then disabled. // diff --git a/src/XrdPosix/XrdPosixObject.cc b/src/XrdPosix/XrdPosixObject.cc index 69728f3c378..f67da5125f4 100644 --- a/src/XrdPosix/XrdPosixObject.cc +++ b/src/XrdPosix/XrdPosixObject.cc @@ -206,16 +206,18 @@ int XrdPosixObject::Init(int fdnum) // Obtain the file descriptor limit but be careful of infinity // - if (getrlimit(RLIMIT_NOFILE, &rlim) - || rlim.rlim_max == RLIM_INFINITY || (int)rlim.rlim_max > maxFD) - {rlim.rlim_cur = 0; rlim.rlim_max = maxFD;} - - limfd = static_cast(rlim.rlim_max); - - if (rlim.rlim_cur != rlim.rlim_max) - {rlim.rlim_cur = rlim.rlim_max; - setrlimit(RLIMIT_NOFILE, &rlim); - } + if (getrlimit(RLIMIT_NOFILE, &rlim)) limfd = maxFD; + else {if (rlim.rlim_max == RLIM_INFINITY || (int)rlim.rlim_max > maxFD) + {rlim.rlim_cur = maxFD; + setrlimit(RLIMIT_NOFILE, &rlim); + } else { + if (rlim.rlim_cur != rlim.rlim_max) + {rlim.rlim_cur = rlim.rlim_max; + setrlimit(RLIMIT_NOFILE, &rlim); + } + } + limfd = static_cast(rlim.rlim_cur); + } // Compute size of table. if the passed fdnum is negative then the caller does // not want us to shadow fd's (ther caller promises to be honest). Otherwise,