Commit 180e785d authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Always pull the local address of the socket out right away and

log it.  Parallel use of sockets would force us to add locking
and that's simply not worth it.

Also:

Fixes #1376
parent 9662a1b3
......@@ -766,8 +766,8 @@ struct sess {
/* Session related fields ------------------------------------*/
struct suckaddr *their_addr;
struct suckaddr *our_addr;
struct suckaddr *remote_addr;
struct suckaddr *local_addr;
/* formatted ascii client address */
char addr[ADDR_BUFSIZE];
......@@ -1114,7 +1114,6 @@ struct req *SES_GetReq(struct worker *, struct sess *);
void SES_Handle(struct sess *sp, double now);
void SES_ReleaseReq(struct req *);
pool_func_t SES_pool_accept_task;
void SES_Get_Our_Addr(struct sess *sp);
/* cache_shmlog.c */
......
......@@ -352,8 +352,7 @@ VCA_SetupSess(struct worker *wrk, struct sess *sp)
wa->acceptsock = -1;
retval = wa->acceptlsock->name;
assert(wa->acceptaddrlen <= vsa_suckaddr_len);
sp->their_addr = VSA_Build(sp->their_addr,
&wa->acceptaddr, wa->acceptaddrlen);
AN(VSA_Build(sp->remote_addr, &wa->acceptaddr, wa->acceptaddrlen));
vca_pace_good();
wrk->stats.sess_conn++;
WS_Release(wrk->aws, 0);
......
......@@ -91,6 +91,11 @@ SES_Charge(struct worker *wrk, struct req *req)
/*--------------------------------------------------------------------
* Get a new session, preferably by recycling an already ready one
*
* Layout is:
* struct sess
* struct vsa (local_addr)
* struct vsa (remote_addr)
*/
static struct sess *
......@@ -107,15 +112,19 @@ ses_new(struct sesspool *pp)
s = (char *)sp;
s += sizeof *sp;
memset(s, 0, vsa_suckaddr_len);
sp->local_addr = (void*)s;
s += vsa_suckaddr_len;
memset(s, 0, vsa_suckaddr_len);
sp->their_addr = (void*)s;
sp->remote_addr = (void*)s;
s += vsa_suckaddr_len;
assert((char *)sp + sz == s);
sp->t_open = NAN;
sp->t_idle = NAN;
sp->our_addr = NULL;
Lck_New(&sp->mtx, lck_sess);
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
return (sp);
......@@ -164,29 +173,6 @@ ses_sess_pool_task(struct worker *wrk, void *arg)
ses_req_pool_task(wrk, req);
}
/*--------------------------------------------------------------------
* Get the local socket address
*/
void
SES_Get_Our_Addr(struct sess *sp)
{
char *s;
struct sockaddr_storage ss;
socklen_t sl;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
if (sp->our_addr != NULL)
return;
sl = sizeof ss;
AZ(getsockname(sp->fd, (void*)&ss, &sl));
s = (char *)sp;
s += sizeof *sp;
sp->our_addr = VSA_Build(s, &ss, sl);
assert(VSA_Sane(sp->our_addr));
}
/*--------------------------------------------------------------------
* VSL log the endpoints of the TCP connection.
*
......@@ -200,22 +186,23 @@ SES_Get_Our_Addr(struct sess *sp)
static void
ses_vsl_socket(struct sess *sp, const char *lsockname)
{
struct sockaddr_storage ss;
socklen_t sl;
char laddr[ADDR_BUFSIZE];
char lport[PORT_BUFSIZE];
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
AN(lsockname);
VTCP_name(sp->their_addr,
AN(sp->local_addr);
sl = sizeof ss;
AZ(getsockname(sp->fd, (void*)&ss, &sl));
AN(VSA_Build(sp->local_addr, &ss, sl));
assert(VSA_Sane(sp->local_addr));
VTCP_name(sp->remote_addr,
sp->addr, sizeof sp->addr, sp->port, sizeof sp->port);
if (cache_param->log_local_addr) {
SES_Get_Our_Addr(sp);
VTCP_name(sp->our_addr,
laddr, sizeof laddr, lport, sizeof lport);
} else {
strcpy(laddr, "-");
strcpy(lport, "-");
}
VTCP_name(sp->local_addr, laddr, sizeof laddr, lport, sizeof lport);
VSL(SLT_Begin, sp->vxid, "sess");
VSL(SLT_SessOpen, sp->vxid, "%s %s %s %s %s %.6f %d",
sp->addr, sp->port, lsockname, laddr, lport, sp->t_open, sp->fd);
......
......@@ -540,7 +540,7 @@ VRT_r_client_ip(const struct vrt_ctx *ctx)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
return (ctx->req->sp->their_addr);
return (ctx->req->sp->remote_addr);
}
VCL_IP
......@@ -549,8 +549,8 @@ VRT_r_server_ip(const struct vrt_ctx *ctx)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
SES_Get_Our_Addr(ctx->req->sp);
return (ctx->req->sp->our_addr);
AN(ctx->req->sp->local_addr);
return (ctx->req->sp->local_addr);
}
const char*
......@@ -584,8 +584,8 @@ VRT_r_server_port(const struct vrt_ctx *ctx)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
SES_Get_Our_Addr(ctx->req->sp);
return (VSA_Port(ctx->req->sp->our_addr));
AN(ctx->req->sp->local_addr);
return (VSA_Port(ctx->req->sp->local_addr));
}
/*--------------------------------------------------------------------*/
......
......@@ -165,9 +165,6 @@ struct params {
/* CLI buffer size */
unsigned cli_buffer;
/* Log local socket address to shm */
unsigned log_local_addr;
/* Prefer IPv6 connections to backend*/
unsigned prefer_ipv6;
......
......@@ -436,14 +436,6 @@ struct parspec mgt_parspec[] = {
"more sessions take a detour around the waiter.",
EXPERIMENTAL,
"0.050", "seconds" },
{ "log_local_address", tweak_bool, &mgt_param.log_local_addr,
NULL, NULL,
"Log the local address on the TCP connection in the "
"SessionOpen VSL record.\n"
"Disabling this saves a getsockname(2) system call "
"per TCP connection.",
0,
"on", "bool" },
{ "waiter", tweak_waiter, NULL,
NULL, NULL,
"Select the waiter kernel interface.",
......
......@@ -8,7 +8,6 @@ server s1 {
# This requires non-local binds to be disabled. If you see this fail
# and are on Linux, ensure /proc/net/ipv4/ip_nonlocal_bind is set to 0.
varnish v1 -cliok "param.set listen_address ${bad_ip}:0"
varnish v1 -cliok "param.set log_local_address off"
varnish v1 -vcl+backend {} -clierr 300 start
varnish v1 -cliok "param.set listen_address 127.0.0.1:0,${bad_ip}:9082"
......
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