From 76236c9b405476160840cc2230e55ed386e99ce0 Mon Sep 17 00:00:00 2001 From: tfheen Date: Tue, 7 Oct 2008 09:46:24 +0000 Subject: [PATCH] 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: svn+ssh://projects.linpro.no/svn/varnish/trunk@3261 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache_acceptor.c | 14 ++++++++++++-- varnish-cache/bin/varnishd/heritage.h | 4 ++++ varnish-cache/bin/varnishd/mgt_param.c | 6 ++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache_acceptor.c b/varnish-cache/bin/varnishd/cache_acceptor.c index e4fa352c..cf47872a 100644 --- a/varnish-cache/bin/varnishd/cache_acceptor.c +++ b/varnish-cache/bin/varnishd/cache_acceptor.c @@ -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; } diff --git a/varnish-cache/bin/varnishd/heritage.h b/varnish-cache/bin/varnishd/heritage.h index 80c1c3a7..9cf61337 100644 --- a/varnish-cache/bin/varnishd/heritage.h +++ b/varnish-cache/bin/varnishd/heritage.h @@ -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; diff --git a/varnish-cache/bin/varnishd/mgt_param.c b/varnish-cache/bin/varnishd/mgt_param.c index 3a080886..fab995dd 100644 --- a/varnish-cache/bin/varnishd/mgt_param.c +++ b/varnish-cache/bin/varnishd/mgt_param.c @@ -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.", -- 2.39.5