[master] ff05032 Convert the sessions local address to be a suckaddr. This shaves 92 bytes of struct sess.

Poul-Henning Kamp phk at varnish-cache.org
Mon Oct 28 08:25:58 CET 2013


commit ff05032e678d070833ed3829495f46097250c6f0
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Oct 28 07:25:13 2013 +0000

    Convert the sessions local address to be a suckaddr.  This shaves
    92 bytes of struct sess.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 662adbd..069a80a 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -768,9 +768,8 @@ struct sess {
 	/* Session related fields ------------------------------------*/
 
 	socklen_t		sockaddrlen;
-	socklen_t		mysockaddrlen;
-	struct sockaddr_storage	sockaddr;
-	struct sockaddr_storage	mysockaddr;
+	struct sockaddr_storage sockaddr;
+	struct suckaddr		*our_addr;
 
 	/* formatted ascii client address */
 	char			addr[ADDR_BUFSIZE];
@@ -1117,6 +1116,8 @@ 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 */
 extern struct VSC_C_main *VSC_C_main;
diff --git a/bin/varnishd/cache/cache_cli.c b/bin/varnishd/cache/cache_cli.c
index a2927fa..55145cd 100644
--- a/bin/varnishd/cache/cache_cli.c
+++ b/bin/varnishd/cache/cache_cli.c
@@ -43,6 +43,7 @@
 
 #include "cache_backend.h"		// struct vbc
 #include "hash/hash_slinger.h"		// struct objhead
+#include "vsa.h"
 #include "vcli.h"
 #include "vcli_common.h"
 #include "vcli_priv.h"
@@ -139,6 +140,8 @@ cli_debug_sizeof(struct cli *cli, const char * const *av, void *priv)
 	SZOF(struct VSC_C_main);
 	SZOF(struct lock);
 	SZOF(struct dstat);
+	VCLI_Out(cli, "sizeof(struct suckaddr) = %d = 0x%x\n",
+	    vsa_suckaddr_len, vsa_suckaddr_len);
 #if 0
 #define OFOF(foo, bar)	{ foo __foo; VCLI_Out(cli, \
     "%-30s = 0x%4zx @ 0x%4zx\n", \
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 8d80160..92221f0 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -47,10 +47,11 @@
 #include "cache.h"
 
 #include "waiter/waiter.h"
+#include "vsa.h"
 #include "vtcp.h"
 #include "vtim.h"
 
-static unsigned ses_size = sizeof (struct sess);
+static unsigned ses_size;
 
 /*--------------------------------------------------------------------*/
 
@@ -89,23 +90,6 @@ SES_Charge(struct worker *wrk, struct req *req)
 }
 
 /*--------------------------------------------------------------------
- * This prepares a session for use, based on its sessmem structure.
- */
-
-static void
-ses_setup(struct sess *sp)
-{
-
-	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
-	sp->sockaddrlen = sizeof(sp->sockaddr);
-	sp->mysockaddrlen = sizeof(sp->mysockaddr);
-	sp->sockaddr.ss_family = sp->mysockaddr.ss_family = PF_UNSPEC;
-	sp->t_open = NAN;
-	sp->t_idle = NAN;
-	Lck_New(&sp->mtx, lck_sess);
-}
-
-/*--------------------------------------------------------------------
  * Get a new session, preferably by recycling an already ready one
  */
 
@@ -118,7 +102,12 @@ ses_new(struct sesspool *pp)
 	sp = MPL_Get(pp->mpl_sess, NULL);
 	sp->magic = SESS_MAGIC;
 	sp->sesspool = pp;
-	ses_setup(sp);
+	sp->sockaddrlen = sizeof(sp->sockaddr);
+	sp->sockaddr.ss_family = PF_UNSPEC;
+	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);
 }
@@ -167,6 +156,29 @@ ses_sess_pool_task(struct worker *wrk, void *arg)
 }
 
 /*--------------------------------------------------------------------
+ * 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.
  *
  * We use VSL() to get the sessions vxid and to make sure tha this
@@ -188,9 +200,8 @@ ses_vsl_socket(struct sess *sp, const char *lsockname)
 	VTCP_name(&sp->sockaddr, sp->sockaddrlen,
 	    sp->addr, sizeof sp->addr, sp->port, sizeof sp->port);
 	if (cache_param->log_local_addr) {
-		AZ(getsockname(sp->fd, (void*)&sp->mysockaddr,
-		    &sp->mysockaddrlen));
-		VTCP_name(&sp->mysockaddr, sp->mysockaddrlen,
+		SES_Get_Our_Addr(sp);
+		VTCP_name((const void*)sp->our_addr, vsa_suckaddr_len,
 		    laddr, sizeof laddr, lport, sizeof lport);
 	} else {
 		strcpy(laddr, "-");
@@ -447,6 +458,7 @@ SES_NewPool(struct pool *wp, unsigned pool_no)
 	pp->mpl_req = MPL_New(nb, &cache_param->req_pool,
 	    &cache_param->workspace_client);
 	bprintf(nb, "sess%u", pool_no);
+	ses_size = sizeof (struct sess) + vsa_suckaddr_len;
 	pp->mpl_sess = MPL_New(nb, &cache_param->sess_pool, &ses_size);
 	return (pp);
 }
diff --git a/bin/varnishd/cache/cache_vrt.c b/bin/varnishd/cache/cache_vrt.c
index 46ceccf..280118b 100644
--- a/bin/varnishd/cache/cache_vrt.c
+++ b/bin/varnishd/cache/cache_vrt.c
@@ -296,7 +296,7 @@ VRT_r_now(const struct vrt_ctx *ctx)
 /*--------------------------------------------------------------------*/
 
 char *
-VRT_IP_string(const struct vrt_ctx *ctx, const VCL_IP ip)
+VRT_IP_string(const struct vrt_ctx *ctx, VCL_IP ip)
 {
 	char *p;
 	unsigned len;
diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index 2526d3b..d14de37 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -41,7 +41,6 @@
 #include "vrt.h"
 #include "vrt_obj.h"
 #include "vsa.h"
-#include "vtcp.h"
 
 static char vrt_hostname[255] = "";
 
@@ -544,21 +543,14 @@ VRT_r_client_ip(const struct vrt_ctx *ctx)
 	return (&ctx->req->sp->sockaddr);
 }
 
-const void *
+VCL_IP
 VRT_r_server_ip(const struct vrt_ctx *ctx)
 {
-	int i;
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
-	if (ctx->req->sp->mysockaddr.ss_family == AF_UNSPEC) {
-		i = getsockname(ctx->req->sp->fd,
-		    (void*)&ctx->req->sp->mysockaddr,
-		    &ctx->req->sp->mysockaddrlen);
-		assert(VTCP_Check(i));
-	}
-
-	return (&ctx->req->sp->mysockaddr);
+	SES_Get_Our_Addr(ctx->req->sp);
+	return (ctx->req->sp->our_addr);
 }
 
 const char*
@@ -589,17 +581,11 @@ VRT_r_server_hostname(const struct vrt_ctx *ctx)
 long
 VRT_r_server_port(const struct vrt_ctx *ctx)
 {
-	int i;
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(ctx->req, REQ_MAGIC);
-	if (ctx->req->sp->mysockaddr.ss_family == AF_UNSPEC) {
-		i = getsockname(ctx->req->sp->fd,
-		    (void*)&ctx->req->sp->mysockaddr,
-		    &ctx->req->sp->mysockaddrlen);
-		assert(VTCP_Check(i));
-	}
-	return (VSA_Port(&ctx->req->sp->mysockaddr));
+	SES_Get_Our_Addr(ctx->req->sp);
+	return (VSA_Port(ctx->req->sp->our_addr));
 }
 
 /*--------------------------------------------------------------------*/



More information about the varnish-commit mailing list