Commit 5894995f authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Always allocate a request before calling CNT_Session()

parent 87f32cb7
...@@ -744,7 +744,7 @@ void VBO_Free(struct busyobj **vbo); ...@@ -744,7 +744,7 @@ void VBO_Free(struct busyobj **vbo);
/* cache_center.c [CNT] */ /* cache_center.c [CNT] */
int CNT_Request(struct worker *, struct req *); int CNT_Request(struct worker *, struct req *);
void CNT_Session(struct worker *, struct sess *); void CNT_Session(struct worker *, struct req *);
void CNT_Init(void); void CNT_Init(void);
/* cache_cli.c [CLI] */ /* cache_cli.c [CLI] */
......
...@@ -117,11 +117,8 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -117,11 +117,8 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
if (req == NULL) {
req = SES_GetReq(sp);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
}
assert(req->sp == sp); assert(req->sp == sp);
if (!sp->init_done) { if (!sp->init_done) {
...@@ -327,13 +324,17 @@ cnt_sess_done(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -327,13 +324,17 @@ cnt_sess_done(struct sess *sp, struct worker *wrk, struct req *req)
*/ */
void void
CNT_Session(struct worker *wrk, struct sess *sp) CNT_Session(struct worker *wrk, struct req *req)
{ {
int done; int done;
struct sess *sp;
enum cnt_sess_done_ret sdr; enum cnt_sess_done_ret sdr;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
sp = req->sp;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
assert(sp->req == req);
/* /*
* Whenever we come in from the acceptor or waiter, we need to set * Whenever we come in from the acceptor or waiter, we need to set
...@@ -348,7 +349,7 @@ CNT_Session(struct worker *wrk, struct sess *sp) ...@@ -348,7 +349,7 @@ CNT_Session(struct worker *wrk, struct sess *sp)
SES_Close(sp, "remote closed"); SES_Close(sp, "remote closed");
else else
SES_Close(sp, "error"); SES_Close(sp, "error");
sdr = cnt_sess_done(sp, wrk, sp->req); sdr = cnt_sess_done(sp, wrk, req);
assert(sdr == SESS_DONE_RET_GONE); assert(sdr == SESS_DONE_RET_GONE);
return; return;
} }
...@@ -357,18 +358,19 @@ CNT_Session(struct worker *wrk, struct sess *sp) ...@@ -357,18 +358,19 @@ CNT_Session(struct worker *wrk, struct sess *sp)
/* /*
* Possible entrance states * Possible entrance states
*/ */
assert(sp->req == req);
assert( assert(
sp->sess_step == S_STP_NEWREQ || sp->sess_step == S_STP_NEWREQ ||
(sp->req != NULL && req->req_step == R_STP_LOOKUP ||
(sp->req->req_step == R_STP_LOOKUP || req->req_step == R_STP_START);
sp->req->req_step == R_STP_START)));
if (sp->sess_step == S_STP_WORKING) { if (sp->sess_step == S_STP_WORKING) {
done = CNT_Request(wrk, sp->req); done = CNT_Request(wrk, req);
if (done == 2) if (done == 2)
return; return;
assert(done == 1); assert(done == 1);
sdr = cnt_sess_done(sp, wrk, sp->req); sdr = cnt_sess_done(sp, wrk, req);
switch (sdr) { switch (sdr) {
case SESS_DONE_RET_GONE: case SESS_DONE_RET_GONE:
return; return;
...@@ -377,7 +379,7 @@ CNT_Session(struct worker *wrk, struct sess *sp) ...@@ -377,7 +379,7 @@ CNT_Session(struct worker *wrk, struct sess *sp)
break; break;
case SESS_DONE_RET_START: case SESS_DONE_RET_START:
sp->sess_step = S_STP_WORKING; sp->sess_step = S_STP_WORKING;
sp->req->req_step = R_STP_START; req->req_step = R_STP_START;
break; break;
default: default:
WRONG("Illegal enum cnt_sess_done_ret"); WRONG("Illegal enum cnt_sess_done_ret");
...@@ -385,12 +387,11 @@ CNT_Session(struct worker *wrk, struct sess *sp) ...@@ -385,12 +387,11 @@ CNT_Session(struct worker *wrk, struct sess *sp)
} }
if (sp->sess_step == S_STP_NEWREQ) { if (sp->sess_step == S_STP_NEWREQ) {
done = cnt_wait(sp, wrk, sp->req); done = cnt_wait(sp, wrk, req);
if (done) { if (done)
return; return;
}
sp->sess_step = S_STP_WORKING; sp->sess_step = S_STP_WORKING;
sp->req->req_step = R_STP_START; req->req_step = R_STP_START;
} }
} }
} }
......
...@@ -124,16 +124,18 @@ ses_new(struct sesspool *pp) ...@@ -124,16 +124,18 @@ ses_new(struct sesspool *pp)
static void static void
ses_pool_task(struct worker *wrk, void *arg) ses_pool_task(struct worker *wrk, void *arg)
{ {
struct req *req;
struct sess *sp; struct sess *sp;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CAST_OBJ_NOTNULL(sp, arg, SESS_MAGIC); CAST_OBJ_NOTNULL(req, arg, REQ_MAGIC);
sp = req->sp;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
AZ(wrk->aws->r); AZ(wrk->aws->r);
wrk->lastused = NAN; wrk->lastused = NAN;
THR_SetSession(sp); THR_SetSession(sp);
CNT_Session(wrk, sp); CNT_Session(wrk, req);
sp = NULL; /* Cannot access sp any longer */
THR_SetSession(NULL); THR_SetSession(NULL);
WS_Assert(wrk->aws); WS_Assert(wrk->aws);
AZ(wrk->wrw); AZ(wrk->wrw);
...@@ -151,6 +153,7 @@ void ...@@ -151,6 +153,7 @@ void
SES_pool_accept_task(struct worker *wrk, void *arg) SES_pool_accept_task(struct worker *wrk, void *arg)
{ {
struct sesspool *pp; struct sesspool *pp;
struct req *req;
struct sess *sp; struct sess *sp;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
...@@ -161,11 +164,13 @@ SES_pool_accept_task(struct worker *wrk, void *arg) ...@@ -161,11 +164,13 @@ SES_pool_accept_task(struct worker *wrk, void *arg)
sp = ses_new(pp); sp = ses_new(pp);
if (sp == NULL) { if (sp == NULL) {
VCA_FailSess(wrk); VCA_FailSess(wrk);
} else { return;
VCA_SetupSess(wrk, sp); }
sp->sess_step = S_STP_NEWREQ; VCA_SetupSess(wrk, sp);
ses_pool_task(wrk, sp); sp->sess_step = S_STP_NEWREQ;
} req = SES_GetReq(sp);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
ses_pool_task(wrk, req);
} }
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
...@@ -186,7 +191,7 @@ SES_ScheduleReq(struct req *req) ...@@ -186,7 +191,7 @@ SES_ScheduleReq(struct req *req)
AN(pp->pool); AN(pp->pool);
sp->task.func = ses_pool_task; sp->task.func = ses_pool_task;
sp->task.priv = sp; sp->task.priv = req;
if (Pool_Task(pp->pool, &sp->task, POOL_QUEUE_FRONT)) { if (Pool_Task(pp->pool, &sp->task, POOL_QUEUE_FRONT)) {
VSC_C_main->client_drop_late++; VSC_C_main->client_drop_late++;
...@@ -206,6 +211,7 @@ SES_ScheduleReq(struct req *req) ...@@ -206,6 +211,7 @@ SES_ScheduleReq(struct req *req)
void void
SES_Handle(struct sess *sp, double now) SES_Handle(struct sess *sp, double now)
{ {
struct req *req;
struct sesspool *pp; struct sesspool *pp;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
...@@ -213,8 +219,10 @@ SES_Handle(struct sess *sp, double now) ...@@ -213,8 +219,10 @@ SES_Handle(struct sess *sp, double now)
CHECK_OBJ_NOTNULL(pp, SESSPOOL_MAGIC); CHECK_OBJ_NOTNULL(pp, SESSPOOL_MAGIC);
AN(pp->pool); AN(pp->pool);
AZ(sp->req); AZ(sp->req);
req = SES_GetReq(sp);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
sp->task.func = ses_pool_task; sp->task.func = ses_pool_task;
sp->task.priv = sp; sp->task.priv = req;
sp->sess_step = S_STP_NEWREQ; sp->sess_step = S_STP_NEWREQ;
sp->t_rx = now; sp->t_rx = now;
if (Pool_Task(pp->pool, &sp->task, POOL_QUEUE_FRONT)) { if (Pool_Task(pp->pool, &sp->task, POOL_QUEUE_FRONT)) {
......
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