Commit 57633531 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Move the probing of system default tcp-keepalive parameters

to a separate source file and open (and close) a socket specifically
for that purpose, so we can do the right thing with parameter
defaults.
parent aa44091e
......@@ -64,6 +64,7 @@ varnishd_SOURCES = \
mgt/mgt_param.c \
mgt/mgt_param_tbl.c \
mgt/mgt_param_bits.c \
mgt/mgt_param_tcp.c \
mgt/mgt_param_tweak.c \
mgt/mgt_pool.c \
mgt/mgt_sandbox.c \
......
......@@ -368,26 +368,11 @@ VCA_SetupSess(struct worker *wrk, struct sess *sp)
/*--------------------------------------------------------------------*/
#ifdef HAVE_TCP_KEEP
static void
vca_tcp_keep_probe(int sock, int nam, volatile unsigned *dst)
{
int i, x;
socklen_t l;
l = sizeof x;
i = getsockopt(sock, IPPROTO_TCP, nam, &x, &l);
if (i == 0 && x < *dst)
*dst = x;
}
#endif
static void *
vca_acct(void *arg)
{
struct listen_sock *ls;
double t0, now;
unsigned u;
int i;
THR_SetName("cache-acceptor");
......@@ -399,18 +384,6 @@ vca_acct(void *arg)
if (ls->sock < 0)
continue;
AZ(listen(ls->sock, cache_param->listen_depth));
#ifdef HAVE_TCP_KEEP
u = (unsigned)round(cache_param->tcp_keepalive_time);
vca_tcp_keep_probe(ls->sock, TCP_KEEPIDLE, &u);
cache_param->tcp_keepalive_time = u;
vca_tcp_keep_probe(ls->sock,
TCP_KEEPCNT, &cache_param->tcp_keepalive_probes);
u = (unsigned)round(cache_param->tcp_keepalive_intvl);
vca_tcp_keep_probe(ls->sock, TCP_KEEPINTVL, &u);
cache_param->tcp_keepalive_intvl = u;
#endif
vca_tcp_opt_set(ls->sock, 1);
if (cache_param->accept_filter) {
i = VTCP_filter_http(ls->sock);
......
......@@ -648,7 +648,6 @@ cnt_restart(struct worker *wrk, struct req *req)
owid = req->vsl->wid & VSL_IDENTMASK;
req->vsl->wid = wid | VSL_CLIENTMARKER;
VSLb(req->vsl, SLT_Begin, "req %u restart", owid);
req->err_code = 0;
req->req_step = R_STP_RECV;
}
......
......@@ -33,6 +33,7 @@
#include "common/common.h"
struct cli;
struct parspec;
extern struct vev_base *mgt_evb;
extern unsigned d_flag;
......@@ -79,8 +80,12 @@ void MCF_SetMaximum(const char *param, const char *def);
void MCF_ParamSet(struct cli *, const char *param, const char *val);
void MCF_ParamProtect(struct cli *, const char *arg);
void MCF_DumpRstParam(void);
void MCF_AddParams(struct parspec *ps);
extern struct params mgt_param;
/* mgt_param_tcp.c */
void MCF_TcpParams(void);
/* mgt_sandbox.c */
enum sandbox_e {
SANDBOX_VCC = 1,
......
......@@ -348,6 +348,8 @@ init_params(struct cli *cli)
MCF_CollectParams();
MCF_TcpParams();
/* If we have nobody/nogroup, use them as defaults */
if (getpwnam("nobody") != NULL)
MCF_SetDefault("user", "nobody");
......
......@@ -358,7 +358,7 @@ mcf_parspec_cmp(const void *a, const void *b)
return (strcmp((*pa)->name, (*pb)->name));
}
static void
void
MCF_AddParams(struct parspec *ps)
{
struct parspec *pp;
......
......@@ -215,31 +215,6 @@ struct parspec mgt_parspec[] = {
"See setsockopt(2) under SO_SNDTIMEO for more information.",
DELAYED_EFFECT,
"60", "seconds" },
#ifdef HAVE_TCP_KEEP
{ "tcp_keepalive_time", tweak_timeout, &mgt_param.tcp_keepalive_time,
"1", "7200",
"The number of seconds a connection needs to be idle before "
"TCP begins sending out keep-alive probes. Note that this "
"setting will only take effect when it is less than the "
"system default.",
EXPERIMENTAL,
"600", "seconds" },
{ "tcp_keepalive_probes", tweak_uint, &mgt_param.tcp_keepalive_probes,
"1", "100",
"The maximum number of TCP keep-alive probes to send before "
"giving up and killing the connection if no response is "
"obtained from the other end. Note that this setting will "
"only take effect when it is less than the system default.",
EXPERIMENTAL,
"5", "probes" },
{ "tcp_keepalive_intvl", tweak_timeout, &mgt_param.tcp_keepalive_intvl,
"1", "100",
"The number of seconds between TCP keep-alive probes. Note "
"that this setting will only take effect when it is less than"
"the system default.",
EXPERIMENTAL,
"5", "seconds" },
#endif
{ "auto_restart", tweak_bool, &mgt_param.auto_restart,
NULL, NULL,
"Restart child process automatically if it dies.",
......
/*-
* Copyright (c) 2006 Verdens Gang AS
* Copyright (c) 2006-2013 Varnish Software AS
* All rights reserved.
*
* Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Parameters related to TCP keepalives are not universally available
* as socket options, and probing for system-wide defaults more appropriate
* than our own involves slightly too much grunt-work to be neglible
* so we sequestrate that code here.
*/
#include "config.h"
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include "mgt/mgt.h"
#include "common/params.h"
#include "vss.h"
#include "mgt/mgt_param.h"
static struct parspec mgt_parspec_tcp_keep[] = {
{ "tcp_keepalive_time", tweak_timeout, &mgt_param.tcp_keepalive_time,
"1", "7200",
"The number of seconds a connection needs to be idle before "
"TCP begins sending out keep-alive probes.",
EXPERIMENTAL,
"", "seconds" },
{ "tcp_keepalive_probes", tweak_uint, &mgt_param.tcp_keepalive_probes,
"1", "100",
"The maximum number of TCP keep-alive probes to send before "
"giving up and killing the connection if no response is "
"obtained from the other end.",
EXPERIMENTAL,
"", "probes" },
{ "tcp_keepalive_intvl", tweak_timeout, &mgt_param.tcp_keepalive_intvl,
"1", "100",
"The number of seconds between TCP keep-alive probes.",
EXPERIMENTAL,
"", "seconds" },
{ NULL, NULL, NULL }
};
#ifdef HAVE_TCP_KEEP
static void
tcp_probe(int sock, int nam, const char *param, unsigned def)
{
int i;
socklen_t l;
unsigned u;
char buf[10];
const char *p;
l = sizeof u;
i = getsockopt(sock, IPPROTO_TCP, nam, &u, &l);
if (i < 0 || u == 0)
u = def;
bprintf(buf, "%u", u);
p = strdup(buf);
AN(p);
MCF_SetDefault(param, p);
}
static void
tcp_keep_probes(void)
{
int i, s;
struct vss_addr **ta;
/* Probe a dummy socket for default values */
i = VSS_resolve(":0", NULL, &ta);
if (i == 0)
return; // XXX: log
assert (i > 0);
s = VSS_listen(ta[0], 10);
if (s < 0)
return; // XXX: log
tcp_probe(s, TCP_KEEPIDLE, "tcp_keepalive_time", 600);
tcp_probe(s, TCP_KEEPCNT, "tcp_keepalive_probes", 5);
tcp_probe(s, TCP_KEEPINTVL, "tcp_keepalive_intvl", 5);
AZ(close(s));
}
#endif
void
MCF_TcpParams(void)
{
#ifdef HAVE_TCP_KEEP
MCF_AddParams(mgt_parspec_tcp_keep);
tcp_keep_probes();
#endif
}
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