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;
}
/* 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;
"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.",