Commit 27d63c26 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Eliminate the "init_done" and listen socket fields from struct sess

by moving the VSL'ing of socket endpoints earlier in the processing.
parent 7e25234d
......@@ -670,8 +670,6 @@ struct sess {
socklen_t mysockaddrlen;
struct sockaddr_storage sockaddr;
struct sockaddr_storage mysockaddr;
struct listen_sock *mylsock;
int init_done;
/* formatted ascii client address */
char addr[ADDR_BUFSIZE];
......@@ -695,7 +693,7 @@ struct sess {
void VCA_Init(void);
void VCA_Shutdown(void);
int VCA_Accept(struct listen_sock *ls, struct wrk_accept *wa);
void VCA_SetupSess(struct worker *w, struct sess *sp);
const char *VCA_SetupSess(struct worker *w, struct sess *sp);
void VCA_FailSess(struct worker *w);
/* cache_backend.c */
......
......@@ -239,10 +239,11 @@ VCA_FailSess(struct worker *wrk)
* We have allocated a session, move our info into it.
*/
void
const char *
VCA_SetupSess(struct worker *wrk, struct sess *sp)
{
struct wrk_accept *wa;
const char *retval;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
......@@ -252,9 +253,7 @@ VCA_SetupSess(struct worker *wrk, struct sess *sp)
sp->fd = wa->acceptsock;
sp->vsl_id = wa->acceptsock | VSL_CLIENTMARKER ;
wa->acceptsock = -1;
sp->t_open = VTIM_real();
sp->mylsock = wa->acceptlsock;
CHECK_OBJ_NOTNULL(sp->mylsock, LISTEN_SOCK_MAGIC);
retval = wa->acceptlsock->name;
assert(wa->acceptaddrlen <= sp->sockaddrlen);
memcpy(&sp->sockaddr, &wa->acceptaddr, wa->acceptaddrlen);
sp->sockaddrlen = wa->acceptaddrlen;
......@@ -277,6 +276,7 @@ VCA_SetupSess(struct worker *wrk, struct sess *sp)
VTCP_Assert(setsockopt(sp->fd, SOL_SOCKET, SO_RCVTIMEO,
&tv_rcvtimeo, sizeof tv_rcvtimeo));
#endif
return (retval);
}
/*--------------------------------------------------------------------*/
......
......@@ -73,8 +73,6 @@ DOT acceptor -> first [style=bold,color=green]
#include "cache.h"
#include "common/heritage.h"
#include "hash/hash_slinger.h"
#include "vcl.h"
#include "vcli_priv.h"
......@@ -112,8 +110,6 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req)
struct pollfd pfd[1];
double now, when;
const char *why = NULL;
char laddr[ADDR_BUFSIZE];
char lport[PORT_BUFSIZE];
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
......@@ -121,30 +117,6 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req)
assert(req->sp == sp);
if (!sp->init_done) {
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,
laddr, sizeof laddr, lport, sizeof lport);
/* XXX: have no req yet */
VSLb(req->vsl, SLT_SessionOpen, "%s %s %s %s",
sp->addr, sp->port, laddr, lport);
} else {
/* XXX: have no req yet */
VSLb(req->vsl, SLT_SessionOpen, "%s %s %s",
sp->addr, sp->port, sp->mylsock->name);
}
wrk->acct_tmp.sess++;
sp->t_rx = sp->t_open;
sp->t_idle = sp->t_open;
sp->init_done = 1;
}
assert(!isnan(sp->t_rx));
AZ(req->vcl);
......
......@@ -42,6 +42,7 @@
#include "cache.h"
#include "waiter/waiter.h"
#include "vtcp.h"
#include "vtim.h"
static unsigned ses_size = sizeof (struct sess);
......@@ -147,8 +148,41 @@ ses_pool_task(struct worker *wrk, void *arg)
THR_SetRequest(NULL);
}
/*--------------------------------------------------------------------
*/
static void
ses_vsl_socket(struct req *req, const char *lsockname)
{
char laddr[ADDR_BUFSIZE];
char lport[PORT_BUFSIZE];
struct sess *sp;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AN(lsockname);
sp = req->sp;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
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,
laddr, sizeof laddr, lport, sizeof lport);
/* XXX: have no req yet */
VSLb(req->vsl, SLT_SessionOpen, "%s %s %s %s %s",
sp->addr, sp->port, lsockname, laddr, lport);
} else {
/* XXX: have no req yet */
VSLb(req->vsl, SLT_SessionOpen, "%s %s %s - -",
sp->addr, sp->port, lsockname);
}
}
/*--------------------------------------------------------------------
* The pool-task for a newly accepted session
*
* Called from assigned worker thread
*/
void
......@@ -157,6 +191,7 @@ SES_pool_accept_task(struct worker *wrk, void *arg)
struct sesspool *pp;
struct req *req;
struct sess *sp;
const char *lsockname;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CAST_OBJ_NOTNULL(pp, arg, SESSPOOL_MAGIC);
......@@ -168,10 +203,21 @@ SES_pool_accept_task(struct worker *wrk, void *arg)
VCA_FailSess(wrk);
return;
}
VCA_SetupSess(wrk, sp);
sp->sess_step = S_STP_NEWREQ;
sp->t_open = VTIM_real();
sp->t_rx = sp->t_open;
sp->t_idle = sp->t_open;
lsockname = VCA_SetupSess(wrk, sp);
req = ses_GetReq(sp);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
ses_vsl_socket(req, lsockname);
wrk->acct_tmp.sess++;
sp->sess_step = S_STP_NEWREQ;
ses_pool_task(wrk, req);
}
......
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