=== modified file 'src/HelperChildConfig.cc' --- src/HelperChildConfig.cc 2010-02-13 09:16:30 +0000 +++ src/HelperChildConfig.cc 2010-02-20 01:33:07 +0000 @@ -4,11 +4,12 @@ #include -HelperChildConfig::HelperChildConfig(const unsigned int m, const unsigned int s, const unsigned int i, const unsigned int cc) : +HelperChildConfig::HelperChildConfig(const unsigned int m, const unsigned int s, const unsigned int i, const unsigned int cc, const unsigned int im) : n_max(m), n_startup(s), n_idle(i), concurrency(cc), + immortal(im), n_running(0), n_active(0) {} @@ -62,6 +63,8 @@ } } else if (strncmp(token, "concurrency=", 12) == 0) { concurrency = atoi(token + 12); + } else if (strcmp(token, "immortal") == 0) { + immortal = 1; } else { self_destruct(); } === modified file 'src/HelperChildConfig.h' --- src/HelperChildConfig.h 2010-02-13 09:16:30 +0000 +++ src/HelperChildConfig.h 2010-02-20 01:42:43 +0000 @@ -10,7 +10,7 @@ class HelperChildConfig { public: - HelperChildConfig(const unsigned int m=0, const unsigned int s=0, const unsigned int i=1, const unsigned int cc=0); + HelperChildConfig(const unsigned int m=0, const unsigned int s=0, const unsigned int i=1, const unsigned int cc=0, const unsigned int im=0); ~HelperChildConfig(); HelperChildConfig &operator =(const HelperChildConfig &rhs); @@ -54,6 +54,16 @@ */ unsigned int concurrency; + /** + * Whether Squid should die if these helpers are closing too fast. + * This permits use of some script languages which have a maximum script run lifetime (ie PHP) + * + * The danger is that when used on truely broken helpers it will cause Squid to enter an + * infinite loop of restarting helpers. + * Default: 0 - Squid will shutdown if helpers close at too fast a rate. + */ + unsigned int immortal; + /* derived from active operations */ public: @@ -72,7 +82,7 @@ /* Legacy parser interface */ #define parse_HelperChildConfig(c) (c)->parseConfig() -#define dump_HelperChildConfig(e,n,c) storeAppendPrintf((e), "\n%s %d startup=%d idle=%d concurrency=%d\n", (n), (c).n_max, (c).n_startup, (c).n_idle, (c).concurrency) +#define dump_HelperChildConfig(e,n,c) storeAppendPrintf((e), "\n%s %d startup=%d idle=%d concurrency=%d%s\n", (n), (c).n_max, (c).n_startup, (c).n_idle, (c).concurrency, ((c).immortal?" immortal":"")) #define free_HelperChildConfig(dummy) // NO. #endif /* _SQUID_SRC_HELPERCHILDCONFIG_H */ === modified file 'src/helper.cc' --- src/helper.cc 2009-12-16 03:46:59 +0000 +++ src/helper.cc 2010-02-20 01:38:33 +0000 @@ -715,8 +715,14 @@ if (hlp->childs.needNew() > 0) { debugs(80, 1, "Too few " << hlp->id_name << " processes are running (need " << hlp->childs.needNew() << "/" << hlp->childs.n_max << ")"); - if (hlp->childs.n_active < hlp->childs.n_startup && hlp->last_restart > squid_curtime - 30) - fatalf("The %s helpers are crashing too rapidly, need help!\n", hlp->id_name); + if (hlp->childs.n_active < hlp->childs.n_startup && hlp->last_restart > squid_curtime - 30) { + if (!hlp->childs.immortal) { + fatalf("The %s helpers are crashing too rapidly, need help!\n", hlp->id_name); + } else { + debugs(80,0, "WARNING: The " << hlp->id_name << " helpers are crashing too rapidly. They may be broken!"); + debugs(80,0, "WARNING: Immortality override applied."); + } + } debugs(80, 1, "Starting new helpers"); helperOpenServers(hlp); @@ -775,7 +781,13 @@ debugs(80, 1, "Too few " << hlp->id_name << " processes are running (need " << hlp->childs.needNew() << "/" << hlp->childs.n_max << ")"); if (hlp->childs.n_active < hlp->childs.n_startup && hlp->last_restart > squid_curtime - 30) - fatalf("The %s helpers are crashing too rapidly, need help!\n", hlp->id_name); + if (!hlp->childs.immortal) { + fatalf("The %s helpers are crashing too rapidly, need help!\n", hlp->id_name); + } else { + debugs(80,0, "WARNING: The " << hlp->id_name << " helpers are crashing too rapidly. They may be broken!"); + debugs(80,0, "WARNING: Immortality override applied."); + } + } debugs(80, 1, "Starting new helpers"); helperStatefulOpenServers(hlp);