[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