Commit 7abb6695 authored by Tollef Fog Heen's avatar Tollef Fog Heen

Sleep for a bit if accept(2) returns EMFILE

Hopefully, this will mitigate pile-ups somewhat and prevent us from
running out of file descriptors, at least as quickly.

See #330.


git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@3261 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 3f3f27f3
...@@ -221,10 +221,20 @@ vca_acct(void *arg) ...@@ -221,10 +221,20 @@ vca_acct(void *arg)
addr = (void*)&addr_s; addr = (void*)&addr_s;
i = accept(ls->sock, addr, &l); i = accept(ls->sock, addr, &l);
if (i < 0) { if (i < 0) {
if (errno != EAGAIN && errno != ECONNABORTED) { switch (errno) {
case EAGAIN:
case ECONNABORTED:
break;
case EMFILE:
VSL(SLT_Debug, ls->sock, VSL(SLT_Debug, ls->sock,
"Accept failed errno=%d", errno); "Too many open files when accept(2)ing. Sleeping.");
TIM_sleep(params->accept_fd_holdoff * 1000.0);
break;
default:
VSL(SLT_Debug, ls->sock,
"Accept failed: %s", strerror(errno));
/* XXX: stats ? */ /* XXX: stats ? */
break;
} }
continue; continue;
} }
......
...@@ -179,6 +179,10 @@ struct params { ...@@ -179,6 +179,10 @@ struct params {
/* Acceptable clockskew with backends */ /* Acceptable clockskew with backends */
unsigned clock_skew; unsigned clock_skew;
/* Amount of time to sleep when running out of file
descriptors. In msecs */
unsigned accept_fd_holdoff;
}; };
extern volatile struct params *params; extern volatile struct params *params;
......
...@@ -747,6 +747,12 @@ static const struct parspec parspec[] = { ...@@ -747,6 +747,12 @@ static const struct parspec parspec[] = {
"VCL can override this default value for each backend.", "VCL can override this default value for each backend.",
0, 0,
"400", "ms" }, "400", "ms" },
{ "accept_fd_holdoff", tweak_timeout,
&master.accept_fd_holdoff, 0, 3600*1000,
"If we run out of file descriptors, the accept thread will "
"sleep. This parameter control for how long it will sleep.",
EXPERIMENTAL,
"50", "ms" },
{ "clock_skew", tweak_uint, &master.clock_skew, 0, UINT_MAX, { "clock_skew", tweak_uint, &master.clock_skew, 0, UINT_MAX,
"How much clockskew we are willing to accept between the " "How much clockskew we are willing to accept between the "
"backend and our own clock.", "backend and our own clock.",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment