Commit ff05032e authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Convert the sessions local address to be a suckaddr. This shaves

92 bytes of struct sess.
parent e5cbbedd
......@@ -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;
......
......@@ -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", \
......
......@@ -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;
/*--------------------------------------------------------------------*/
......@@ -88,23 +89,6 @@ SES_Charge(struct worker *wrk, struct req *req)
#undef ACCT
}
/*--------------------------------------------------------------------
* 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);
}
......@@ -166,6 +155,29 @@ ses_sess_pool_task(struct worker *wrk, void *arg)
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.
*
......@@ -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);
}
......
......@@ -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;
......
......@@ -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));
}
/*--------------------------------------------------------------------*/
......
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