Fix accept_filter for GNU/Linux
Rafael Zalamena
rafaelfz at taghos.com.br
Fri Sep 4 14:31:47 CEST 2015
Em Fri, 4 Sep 2015 00:48:50 +0100
Federico Schwindt <fgsch at lodoss.net> escreveu:
> And a version aligned with phk's comment (off by default).
>
> On Fri, Sep 4, 2015 at 12:15 AM, Federico Schwindt <fgsch at lodoss.net> wrote:
>
> > Hi,
> >
> > Actually the problem is somewhere else.
> >
> > The attached diff should fix it.
> >
> > Cheers.
> >
With your diff varnish will spam log messages on systems without
ACCEPT_FILTERS or TCP_DEFER_ACCEPT by default.
I've modified my diff to kill some ifdefs and make accept_filter always
avaliable, but this time disabled by default on system without
ACCEPT_FILTERS or with TCP_DEFER_ACCEPT.
With this:
(1) anyone who wants to enable accept_filter on GNU/Linux should just
call varnish with 'varnishd ... -p accept_filter=on';
(2) anyone who enables accept_filter on a system without it will have a
log spam about not having support for this feature;
(3) we get to keep the old behavior for systems with ACCEPT_FILTERS;
diff --git bin/varnishd/cache/cache_acceptor.c bin/varnishd/cache/cache_acceptor.c
index 9736ca9..a17351d 100644
--- bin/varnishd/cache/cache_acceptor.c
+++ bin/varnishd/cache/cache_acceptor.c
@@ -489,7 +489,6 @@ vca_acct(void *arg)
assert (ls->sock > 0); // We know where stdin is
AZ(listen(ls->sock, cache_param->listen_depth));
vca_tcp_opt_set(ls->sock, 1);
-#ifdef HAVE_ACCEPT_FILTERS
if (cache_param->accept_filter) {
int i;
i = VTCP_filter_http(ls->sock);
@@ -498,7 +497,6 @@ vca_acct(void *arg)
"Kernel filtering: sock=%d, ret=%d %s",
ls->sock, i, strerror(errno));
}
-#endif /* HAVE_ACCEPT_FILTERS */
}
need_test = 1;
diff --git configure.ac configure.ac
index 6c4d5f2..4a50fd8 100644
--- configure.ac
+++ configure.ac
@@ -366,6 +366,19 @@ AC_CHECK_DECL([SO_ACCEPTFILTER],
]
)
+AC_CHECK_DECL([TCP_DEFER_ACCEPT],
+ [
+ AC_DEFINE(HAVE_ACCEPT_FILTERS,1,[Define to 1 if you have accept filters]),
+ AC_DEFINE(HAVE_TCP_DEFER_ACCEPT,1,[Define to 1 if you have TCP defer accept])
+ ],
+ ,
+ [
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+ ]
+)
+
# Older Solaris versions define SO_{RCV,SND}TIMEO, but do not
# implement them.
#
diff --git include/tbl/params.h include/tbl/params.h
index d3a2982..6cbe3ba 100644
--- include/tbl/params.h
+++ include/tbl/params.h
@@ -30,13 +30,16 @@
/*lint -save -e525 -e539 */
-#ifdef HAVE_ACCEPT_FILTERS
PARAM(
/* name */ accept_filter,
/* typ */ bool,
/* min */ NULL,
/* max */ NULL,
+#if defined(HAVE_ACCEPT_FILTERS) && !defined(HAVE_TCP_DEFER_ACCEPT)
/* default */ "on",
+#else
+ /* default */ "off",
+#endif /* HAVE_ACCEPT_FILTERS */
/* units */ "bool",
/* flags */ MUST_RESTART,
/* s-text */
@@ -44,7 +47,6 @@ PARAM(
/* l-text */ NULL,
/* func */ NULL
)
-#endif /* HAVE_ACCEPT_FILTERS */
PARAM(
/* name */ acceptor_sleep_decay,
diff --git lib/libvarnish/vtcp.c lib/libvarnish/vtcp.c
index 3992555..732c2ea 100644
--- lib/libvarnish/vtcp.c
+++ lib/libvarnish/vtcp.c
@@ -146,6 +146,7 @@ VTCP_hisname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen)
/*--------------------------------------------------------------------*/
#ifdef HAVE_ACCEPT_FILTERS
+#ifndef HAVE_TCP_DEFER_ACCEPT
int
VTCP_filter_http(int sock)
@@ -160,7 +161,7 @@ VTCP_filter_http(int sock)
return (retval);
}
-#elif defined(__linux)
+#else /* HAVE_TCP_DEFER_ACCEPT */
int
VTCP_filter_http(int sock)
@@ -173,6 +174,7 @@ VTCP_filter_http(int sock)
return (retval);
}
+#endif
#else
int
More information about the varnish-dev
mailing list