[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