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