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)
addr = (void*)&addr_s;
i = accept(ls->sock, addr, &l);
if (i < 0) {
if (errno != EAGAIN && errno != ECONNABORTED) {
switch (errno) {
case EAGAIN:
case ECONNABORTED:
break;
case EMFILE:
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 ? */
break;
}
continue;
}
......
......@@ -179,6 +179,10 @@ struct params {
/* Acceptable clockskew with backends */
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;
......
......@@ -747,6 +747,12 @@ static const struct parspec parspec[] = {
"VCL can override this default value for each backend.",
0,
"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,
"How much clockskew we are willing to accept between the "
"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