diff -up squid-2.6.STABLE16/src/tools.c.fd squid-2.6.STABLE16/src/tools.c --- squid-2.6.STABLE16/src/tools.c.fd 2007-09-01 22:09:50.000000000 +0200 +++ squid-2.6.STABLE16/src/tools.c 2007-09-21 15:01:32.000000000 +0200 @@ -1,6 +1,6 @@ /* - * $Id: tools.c,v 1.250.2.3 2007/09/01 20:09:50 hno Exp $ + * $Id: tools.c,v 1.255 2007/06/29 00:08:18 hno Exp $ * * DEBUG: section 21 Misc Functions * AUTHOR: Harvest Derived @@ -735,46 +735,62 @@ readPidFile(void) } +/* A little piece of glue for odd systems */ +#ifndef RLIMIT_NOFILE +#ifdef RLIMIT_OFILE +#define RLIMIT_NOFILE RLIMIT_OFILE +#endif +#endif + +/* Figure out the number of supported filedescriptors */ void setMaxFD(void) { -#if HAVE_SETRLIMIT - /* try to use as many file descriptors as possible */ - /* System V uses RLIMIT_NOFILE and BSD uses RLIMIT_OFILE */ +#if HAVE_SETRLIMIT && defined(RLIMIT_NOFILE) struct rlimit rl; -#if !defined(_SQUID_CYGWIN_) -#if defined(RLIMIT_NOFILE) if (getrlimit(RLIMIT_NOFILE, &rl) < 0) { - debug(50, 0) ("setrlimit: RLIMIT_NOFILE: %s\n", xstrerror()); - } else { - rl.rlim_cur = Squid_MaxFD; - if (rl.rlim_cur > rl.rlim_max) - Squid_MaxFD = rl.rlim_cur = rl.rlim_max; - if (setrlimit(RLIMIT_NOFILE, &rl) < 0) { - snprintf(tmp_error_buf, ERROR_BUF_SZ, - "setrlimit: RLIMIT_NOFILE: %s", xstrerror()); - fatal_dump(tmp_error_buf); - } + debug(50, 0) ("setrlimit: RLIMIT_NOFILE: %s\n", xstrerror()); + } else if (Config.max_filedescriptors > 0) { + rl.rlim_cur = Config.max_filedescriptors; + if (rl.rlim_cur > rl.rlim_max) + rl.rlim_max = rl.rlim_cur; + if (setrlimit(RLIMIT_NOFILE, &rl)) { + debug(50, 0) ("setrlimit: RLIMIT_NOFILE: %s\n", xstrerror()); + getrlimit(RLIMIT_NOFILE, &rl); + rl.rlim_cur = rl.rlim_max; + if (setrlimit(RLIMIT_NOFILE, &rl)) { + debug(50, 0) ("setrlimit: RLIMIT_NOFILE: %s\n", xstrerror()); + } + } } -#elif defined(RLIMIT_OFILE) - if (getrlimit(RLIMIT_OFILE, &rl) < 0) { - debug(50, 0) ("setrlimit: RLIMIT_NOFILE: %s\n", xstrerror()); + if (getrlimit(RLIMIT_NOFILE, &rl) < 0) { + debug(50, 0) ("setrlimit: RLIMIT_NOFILE: %s\n", xstrerror()); } else { - rl.rlim_cur = Squid_MaxFD; - if (rl.rlim_cur > rl.rlim_max) - Squid_MaxFD = rl.rlim_cur = rl.rlim_max; - if (setrlimit(RLIMIT_OFILE, &rl) < 0) { - snprintf(tmp_error_buf, ERROR_BUF_SZ, - "setrlimit: RLIMIT_OFILE: %s", xstrerror()); - fatal_dump(tmp_error_buf); - } + Squid_MaxFD = rl.rlim_cur; } -#endif -#endif -#else /* HAVE_SETRLIMIT */ - debug(21, 1) ("setMaxFD: Cannot increase: setrlimit() not supported on this system\n"); #endif /* HAVE_SETRLIMIT */ +} +void +setSystemLimits(void) +{ +#if HAVE_SETRLIMIT && defined(RLIMIT_NOFILE) && !defined(_SQUID_CYGWIN_) + /* limit system filedescriptors to our own limit */ + struct rlimit rl; + if (getrlimit(RLIMIT_NOFILE, &rl) < 0) { + debug(50, 0) ("setrlimit: RLIMIT_NOFILE: %s\n", xstrerror()); + } else { + rl.rlim_cur = Squid_MaxFD; + if (setrlimit(RLIMIT_NOFILE, &rl) < 0) { + snprintf(tmp_error_buf, ERROR_BUF_SZ, + "setrlimit: RLIMIT_NOFILE: %s", xstrerror()); + fatal_dump(tmp_error_buf); + } + } + #endif /* HAVE_SETRLIMIT */ + if (Config.max_filedescriptors > Squid_MaxFD) { + debug(50, 1) ("NOTICE: Could not increase the number of filedescriptors\n"); + } #if HAVE_SETRLIMIT && defined(RLIMIT_DATA) if (getrlimit(RLIMIT_DATA, &rl) < 0) { debug(50, 0) ("getrlimit: RLIMIT_DATA: %s\n", xstrerror()); diff -up squid-2.6.STABLE16/src/cf.data.pre.fd squid-2.6.STABLE16/src/cf.data.pre --- squid-2.6.STABLE16/src/cf.data.pre.fd 2007-09-21 12:52:28.000000000 +0200 +++ squid-2.6.STABLE16/src/cf.data.pre 2007-09-21 15:07:15.000000000 +0200 @@ -1,6 +1,6 @@ # -# $Id: cf.data.pre,v 1.382.2.14 2007/09/05 21:50:15 hno Exp $ +# $Id: cf.data.pre,v 1.424 2007/09/19 11:50:39 hno Exp $ # # SQUID Web Proxy Cache http://www.squid-cache.org/ # ---------------------------------------------------------- @@ -5216,4 +5216,16 @@ DOC_START rounded to 1000. DOC_END +NAME: max_filedescriptors max_filedesc +TYPE: int +DEFAULT: 0 +LOC: Config.max_filedescriptors +DOC_START + The maximum number of filedescriptors supported. + + The default "0" means Squid inherits the current ulimit setting. + + Note: Changing this requires a restart of Squid. Also + not all comm loops supports values larger than --with-maxfd. +DOC_END EOF diff -up squid-2.6.STABLE16/src/protos.h.fd squid-2.6.STABLE16/src/protos.h --- squid-2.6.STABLE16/src/protos.h.fd 2007-07-15 11:52:17.000000000 +0200 +++ squid-2.6.STABLE16/src/protos.h 2007-09-21 15:03:14.000000000 +0200 @@ -1,6 +1,6 @@ /* - * $Id: protos.h,v 1.520.2.3 2007/07/15 09:52:17 hno Exp $ + * $Id: protos.h,v 1.531 2007/06/29 00:08:18 hno Exp $ * * * SQUID Web Proxy Cache http://www.squid-cache.org/ @@ -1102,6 +1102,7 @@ extern void no_suid(void); extern void writePidFile(void); extern void setSocketShutdownLifetimes(int); extern void setMaxFD(void); +extern void setSystemLimits(void); extern time_t getCurrentTime(void); extern int percent(int, int); extern double dpercent(double, double); diff -up squid-2.6.STABLE16/src/main.c.fd squid-2.6.STABLE16/src/main.c --- squid-2.6.STABLE16/src/main.c.fd 2007-08-31 15:52:10.000000000 +0200 +++ squid-2.6.STABLE16/src/main.c 2007-09-21 15:04:01.000000000 +0200 @@ -1,6 +1,6 @@ /* - * $Id: main.c,v 1.393.2.4 2007/08/31 13:52:10 hno Exp $ + * $Id: main.c,v 1.397 2007/06/29 00:08:18 hno Exp $ * * DEBUG: section 1 Startup and Main Loop * AUTHOR: Harvest Derived @@ -552,6 +552,7 @@ mainInitialize(void) debug(1, 0) ("Running on %s\n", WIN32_OS_string); #endif debug(1, 1) ("Process ID %d\n", (int) getpid()); + setSystemLimits(); debug(1, 1) ("With %d file descriptors available\n", Squid_MaxFD); #ifdef _SQUID_MSWIN_ debug(1, 1) ("With %d CRT stdio descriptors available\n", _getmaxstdio()); diff -up squid-2.6.STABLE16/src/structs.h.fd squid-2.6.STABLE16/src/structs.h --- squid-2.6.STABLE16/src/structs.h.fd 2007-09-05 23:28:34.000000000 +0200 +++ squid-2.6.STABLE16/src/structs.h 2007-09-21 15:04:49.000000000 +0200 @@ -1,6 +1,6 @@ /* - * $Id: structs.h,v 1.507.2.8 2007/09/05 21:28:34 hno Exp $ + * $Id: structs.h,v 1.517 2007/06/28 23:22:01 hno Exp $ * * * SQUID Web Proxy Cache http://www.squid-cache.org/ @@ -810,6 +810,7 @@ struct _SquidConfig { #endif time_t refresh_stale_window; int umask; + int max_filedescriptors; }; struct _SquidConfig2 {