[master] d75ca3b Sequeze struct sess storage harder. When we add the extra {local|remote}.ip for PROXY support, we do not want to waste 16 bytes extra on pointers, so put all the {client|server|local|remote}.ip into a single array -- which is unfortunately complicated by the opaqueness of struct vsa.

Poul-Henning Kamp phk at FreeBSD.org
Tue Dec 3 17:38:41 CET 2013


commit d75ca3b4fcb28412ec50a8c6b1e054a9e4c43e8e
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Dec 3 10:45:54 2013 +0000

    Sequeze struct sess storage harder.  When we add the extra
    {local|remote}.ip for PROXY support, we do not want to waste 16 bytes
    extra on pointers, so put all the {client|server|local|remote}.ip into
    a single array -- which is unfortunately complicated by the opaqueness
    of struct vsa.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index b99e460..5cbc27b 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -775,8 +775,15 @@ struct sess {
 
 	struct ws		ws[1];
 
-	struct suckaddr		*remote_addr;
-	struct suckaddr		*local_addr;
+	/*
+	 * This gets quite involved, but we don't want to waste space
+	 * on up to 4 pointers of 8 bytes in struct sess.
+	 */
+	char			*addrs;
+#define sess_remote_addr(sp) \
+	((struct suckaddr *)(void*)((sp)->addrs))
+#define sess_local_addr(sp) \
+	((struct suckaddr *)(void*)((sp)->addrs + vsa_suckaddr_len))
 
 	/* formatted ascii client address */
 	char			*client_addr_str;
diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index 8f39e7c..2f5237c 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -352,7 +352,7 @@ VCA_SetupSess(struct worker *wrk, struct sess *sp)
 	wa->acceptsock = -1;
 	retval = wa->acceptlsock->name;
 	assert(wa->acceptaddrlen <= vsa_suckaddr_len);
-	AN(VSA_Build(sp->remote_addr, &wa->acceptaddr, wa->acceptaddrlen));
+	AN(VSA_Build(sess_remote_addr(sp), &wa->acceptaddr, wa->acceptaddrlen));
 	vca_pace_good();
 	wrk->stats.sess_conn++;
 	WS_Release(wrk->aws, 0);
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 46cb31f..7b38cef 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -112,8 +112,7 @@ ses_new(struct sesspool *pp)
 	p = (void*)PRNDUP(p);
 	assert(p < e);
 	WS_Init(sp->ws, "ses", p, e - p);
-	sp->local_addr = (void*)WS_Alloc(sp->ws, vsa_suckaddr_len);
-	sp->remote_addr = (void*)WS_Alloc(sp->ws, vsa_suckaddr_len);
+	sp->addrs = (void*)WS_Alloc(sp->ws, vsa_suckaddr_len * 2);
 
 	sp->t_open = NAN;
 	sp->t_idle = NAN;
@@ -186,16 +185,18 @@ ses_vsl_socket(struct sess *sp, const char *lsockname)
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 	AN(lsockname);
 
-	AN(sp->local_addr);
+	AN(sp->addrs);
 	sl = sizeof ss;
 	AZ(getsockname(sp->fd, (void*)&ss, &sl));
-	AN(VSA_Build(sp->local_addr, &ss, sl));
-	assert(VSA_Sane(sp->local_addr));
+	AN(VSA_Build(sess_local_addr(sp), &ss, sl));
+	assert(VSA_Sane(sess_local_addr(sp)));
 
-	VTCP_name(sp->remote_addr, laddr, sizeof laddr, lport, sizeof lport);
+	VTCP_name(sess_remote_addr(sp), laddr, sizeof laddr,
+	    lport, sizeof lport);
 	sp->client_addr_str = WS_Copy(sp->ws, laddr, -1);
 	sp->client_port_str = WS_Copy(sp->ws, lport, -1);
-	VTCP_name(sp->local_addr, laddr, sizeof laddr, lport, sizeof lport);
+	VTCP_name(sess_local_addr(sp), 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->client_addr_str, sp->client_port_str, lsockname, laddr, lport,
diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index a769a06..aec97dd 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -40,6 +40,7 @@
 #include "cache_backend.h"
 #include "vrt.h"
 #include "vrt_obj.h"
+#include "vsa.h"
 
 static char vrt_hostname[255] = "";
 
@@ -501,7 +502,8 @@ 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->remote_addr);
+	CHECK_OBJ_NOTNULL(ctx->req->sp, SESS_MAGIC);
+	return (sess_remote_addr(ctx->req->sp));
 }
 
 VCL_IP
@@ -510,8 +512,8 @@ VRT_r_server_ip(const struct vrt_ctx *ctx)
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
-	AN(ctx->req->sp->local_addr);
-	return (ctx->req->sp->local_addr);
+	CHECK_OBJ_NOTNULL(ctx->req->sp, SESS_MAGIC);
+	return (sess_local_addr(ctx->req->sp));
 }
 
 const char*



More information about the varnish-commit mailing list