Commit 3325c6c7 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Eliminate the "sp" argument to the request state engine states.

parent 42780ae2
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* This file contains the two central state machine for pushing * This file contains the two central state machine for pushing
* sessions and requests. * sessions and requests.
* *
* The first part of the file, entrypoint CNT_Session() and down to * The first part of the file, entrypoint CNT_Session() and down to
...@@ -370,10 +370,10 @@ CNT_Session(struct sess *sp) ...@@ -370,10 +370,10 @@ CNT_Session(struct sess *sp)
case SESS_DONE_RET_GONE: case SESS_DONE_RET_GONE:
return; return;
case SESS_DONE_RET_WAIT: case SESS_DONE_RET_WAIT:
sp->step = STP_WAIT; sp->step = STP_WAIT;
break; break;
case SESS_DONE_RET_START: case SESS_DONE_RET_START:
sp->step = STP_START; sp->step = STP_START;
break; break;
default: default:
WRONG("Illegal enum cnt_sess_done_ret"); WRONG("Illegal enum cnt_sess_done_ret");
...@@ -409,11 +409,10 @@ DOT } ...@@ -409,11 +409,10 @@ DOT }
*/ */
static int static int
cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req) cnt_prepresp(struct worker *wrk, struct req *req)
{ {
struct busyobj *bo; struct busyobj *bo;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
bo = req->busyobj; bo = req->busyobj;
...@@ -476,9 +475,7 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -476,9 +475,7 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req)
HTTP_Setup(req->resp, req->ws, req->vsl, HTTP_Resp); HTTP_Setup(req->resp, req->ws, req->vsl, HTTP_Resp);
RES_BuildHttp(req); RES_BuildHttp(req);
assert(req->sp == sp);
VCL_deliver_method(req); VCL_deliver_method(req);
assert(req->sp == sp);
switch (req->handling) { switch (req->handling) {
case VCL_RET_DELIVER: case VCL_RET_DELIVER:
break; break;
...@@ -494,12 +491,12 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -494,12 +491,12 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req)
} }
AZ(req->obj); AZ(req->obj);
http_Teardown(req->resp); http_Teardown(req->resp);
sp->step = STP_RESTART; req->sp->step = STP_RESTART;
return (0); return (0);
default: default:
WRONG("Illegal action in vcl_deliver{}"); WRONG("Illegal action in vcl_deliver{}");
} }
sp->step = STP_DELIVER; req->sp->step = STP_DELIVER;
return (0); return (0);
} }
...@@ -519,11 +516,10 @@ DOT deliver -> DONE [style=bold,color=blue] ...@@ -519,11 +516,10 @@ DOT deliver -> DONE [style=bold,color=blue]
*/ */
static int static int
cnt_deliver(struct sess *sp, struct worker *wrk, struct req *req) cnt_deliver(struct worker *wrk, struct req *req)
{ {
struct busyobj *bo; struct busyobj *bo;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
...@@ -539,7 +535,7 @@ cnt_deliver(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -539,7 +535,7 @@ cnt_deliver(struct sess *sp, struct worker *wrk, struct req *req)
HSH_Deref(&wrk->stats, NULL, &req->obj); HSH_Deref(&wrk->stats, NULL, &req->obj);
VBO_DerefBusyObj(wrk, &req->busyobj); VBO_DerefBusyObj(wrk, &req->busyobj);
req->err_code = 503; req->err_code = 503;
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
return (0); return (0);
} }
VBO_DerefBusyObj(wrk, &req->busyobj); VBO_DerefBusyObj(wrk, &req->busyobj);
...@@ -576,13 +572,12 @@ DOT rsterr [label="RESTART",shape=plaintext] ...@@ -576,13 +572,12 @@ DOT rsterr [label="RESTART",shape=plaintext]
*/ */
static int static int
cnt_error(struct sess *sp, struct worker *wrk, struct req *req) cnt_error(struct worker *wrk, struct req *req)
{ {
struct http *h; struct http *h;
struct busyobj *bo; struct busyobj *bo;
char date[40]; char date[40];
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AZ(req->objcore); AZ(req->objcore);
...@@ -591,7 +586,7 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -591,7 +586,7 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req)
bo = VBO_GetBusyObj(wrk); bo = VBO_GetBusyObj(wrk);
req->busyobj = bo; req->busyobj = bo;
bo->vsl->wid = sp->vsl_id; bo->vsl->wid = req->sp->vsl_id;
AZ(bo->stats); AZ(bo->stats);
bo->stats = &wrk->stats; bo->stats = &wrk->stats;
req->objcore = HSH_NewObjCore(wrk); req->objcore = HSH_NewObjCore(wrk);
...@@ -625,15 +620,13 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -625,15 +620,13 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req)
http_PutResponse(h, req->err_reason); http_PutResponse(h, req->err_reason);
else else
http_PutResponse(h, http_StatusMessage(req->err_code)); http_PutResponse(h, http_StatusMessage(req->err_code));
assert(req->sp == sp);
VCL_error_method(req); VCL_error_method(req);
assert(req->sp == sp);
if (req->handling == VCL_RET_RESTART && if (req->handling == VCL_RET_RESTART &&
req->restarts < cache_param->max_restarts) { req->restarts < cache_param->max_restarts) {
HSH_Drop(wrk, &req->obj); HSH_Drop(wrk, &req->obj);
VBO_DerefBusyObj(wrk, &req->busyobj); VBO_DerefBusyObj(wrk, &req->busyobj);
sp->step = STP_RESTART; req->sp->step = STP_RESTART;
return (0); return (0);
} else if (req->handling == VCL_RET_RESTART) } else if (req->handling == VCL_RET_RESTART)
req->handling = VCL_RET_DELIVER; req->handling = VCL_RET_DELIVER;
...@@ -648,7 +641,7 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -648,7 +641,7 @@ cnt_error(struct sess *sp, struct worker *wrk, struct req *req)
req->err_reason = NULL; req->err_reason = NULL;
http_Teardown(bo->bereq); http_Teardown(bo->bereq);
VBO_DerefBusyObj(wrk, &req->busyobj); VBO_DerefBusyObj(wrk, &req->busyobj);
sp->step = STP_PREPRESP; req->sp->step = STP_PREPRESP;
return (0); return (0);
} }
...@@ -666,12 +659,11 @@ DOT fetch -> fetchbody [style=bold,color=blue] ...@@ -666,12 +659,11 @@ DOT fetch -> fetchbody [style=bold,color=blue]
*/ */
static int static int
cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req) cnt_fetch(struct worker *wrk, struct req *req)
{ {
int i, need_host_hdr; int i, need_host_hdr;
struct busyobj *bo; struct busyobj *bo;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
...@@ -736,16 +728,14 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -736,16 +728,14 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req)
AZ(bo->do_esi); AZ(bo->do_esi);
AZ(bo->do_pass); AZ(bo->do_pass);
assert(req->sp == sp);
VCL_fetch_method(req); VCL_fetch_method(req);
assert(req->sp == sp);
if (bo->do_pass) if (bo->do_pass)
req->objcore->flags |= OC_F_PASS; req->objcore->flags |= OC_F_PASS;
switch (req->handling) { switch (req->handling) {
case VCL_RET_DELIVER: case VCL_RET_DELIVER:
sp->step = STP_FETCHBODY; req->sp->step = STP_FETCHBODY;
return (0); return (0);
default: default:
break; break;
...@@ -771,10 +761,10 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -771,10 +761,10 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req)
switch (req->handling) { switch (req->handling) {
case VCL_RET_RESTART: case VCL_RET_RESTART:
sp->step = STP_RESTART; req->sp->step = STP_RESTART;
return (0); return (0);
case VCL_RET_ERROR: case VCL_RET_ERROR:
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
return (0); return (0);
default: default:
WRONG("Illegal action in vcl_fetch{}"); WRONG("Illegal action in vcl_fetch{}");
...@@ -795,7 +785,7 @@ DOT fetchbody:out -> prepresp [style=bold,color=blue] ...@@ -795,7 +785,7 @@ DOT fetchbody:out -> prepresp [style=bold,color=blue]
*/ */
static int static int
cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req) cnt_fetchbody(struct worker *wrk, struct req *req)
{ {
struct http *hp, *hp2; struct http *hp, *hp2;
char *b; char *b;
...@@ -805,7 +795,6 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -805,7 +795,6 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
int varyl = 0, pass; int varyl = 0, pass;
struct busyobj *bo; struct busyobj *bo;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
bo = req->busyobj; bo = req->busyobj;
...@@ -930,7 +919,7 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -930,7 +919,7 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
bo->stats = NULL; bo->stats = NULL;
if (req->obj == NULL) { if (req->obj == NULL) {
req->err_code = 503; req->err_code = 503;
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
VDI_CloseFd(&bo->vbc); VDI_CloseFd(&bo->vbc);
VBO_DerefBusyObj(wrk, &req->busyobj); VBO_DerefBusyObj(wrk, &req->busyobj);
return (0); return (0);
...@@ -1011,12 +1000,12 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1011,12 +1000,12 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
HSH_Deref(&wrk->stats, NULL, &req->obj); HSH_Deref(&wrk->stats, NULL, &req->obj);
VBO_DerefBusyObj(wrk, &req->busyobj); VBO_DerefBusyObj(wrk, &req->busyobj);
req->err_code = 503; req->err_code = 503;
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
return (0); return (0);
} }
assert(WRW_IsReleased(wrk)); assert(WRW_IsReleased(wrk));
sp->step = STP_PREPRESP; req->sp->step = STP_PREPRESP;
return (0); return (0);
} }
...@@ -1039,9 +1028,8 @@ DOT hit:del -> prepresp [label="deliver",style=bold,color=green] ...@@ -1039,9 +1028,8 @@ DOT hit:del -> prepresp [label="deliver",style=bold,color=green]
*/ */
static int static int
cnt_hit(struct sess *sp, struct worker *wrk, struct req *req) cnt_hit(struct worker *wrk, struct req *req)
{ {
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
...@@ -1052,15 +1040,13 @@ cnt_hit(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1052,15 +1040,13 @@ cnt_hit(struct sess *sp, struct worker *wrk, struct req *req)
assert(!(req->obj->objcore->flags & OC_F_PASS)); assert(!(req->obj->objcore->flags & OC_F_PASS));
assert(req->sp == sp);
VCL_hit_method(req); VCL_hit_method(req);
assert(req->sp == sp);
if (req->handling == VCL_RET_DELIVER) { if (req->handling == VCL_RET_DELIVER) {
//AZ(req->busyobj->bereq->ws); //AZ(req->busyobj->bereq->ws);
//AZ(req->busyobj->beresp->ws); //AZ(req->busyobj->beresp->ws);
(void)FetchReqBody(req, 0); (void)FetchReqBody(req, 0);
sp->step = STP_PREPRESP; req->sp->step = STP_PREPRESP;
return (0); return (0);
} }
...@@ -1070,13 +1056,13 @@ cnt_hit(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1070,13 +1056,13 @@ cnt_hit(struct sess *sp, struct worker *wrk, struct req *req)
switch(req->handling) { switch(req->handling) {
case VCL_RET_PASS: case VCL_RET_PASS:
sp->step = STP_PASS; req->sp->step = STP_PASS;
return (0); return (0);
case VCL_RET_ERROR: case VCL_RET_ERROR:
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
return (0); return (0);
case VCL_RET_RESTART: case VCL_RET_RESTART:
sp->step = STP_RESTART; req->sp->step = STP_RESTART;
return (0); return (0);
default: default:
WRONG("Illegal action in vcl_hit{}"); WRONG("Illegal action in vcl_hit{}");
...@@ -1103,13 +1089,12 @@ DOT lookup:yes -> pass [style=bold,color=red] ...@@ -1103,13 +1089,12 @@ DOT lookup:yes -> pass [style=bold,color=red]
*/ */
static int static int
cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req) cnt_lookup(struct worker *wrk, struct req *req)
{ {
struct objcore *oc; struct objcore *oc;
struct object *o; struct object *o;
struct objhead *oh; struct objhead *oh;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AZ(req->objcore); AZ(req->objcore);
...@@ -1127,7 +1112,6 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1127,7 +1112,6 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req)
* worker thread. We return to STP_LOOKUP when the busy * worker thread. We return to STP_LOOKUP when the busy
* object has been unbusied, and still have the hash digest * object has been unbusied, and still have the hash digest
* around to do the lookup with. * around to do the lookup with.
* NB: Do not access sp any more !
*/ */
return (2); return (2);
} }
...@@ -1156,7 +1140,7 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1156,7 +1140,7 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req)
req->vary_e = NULL; req->vary_e = NULL;
req->objcore = oc; req->objcore = oc;
sp->step = STP_MISS; req->sp->step = STP_MISS;
return (0); return (0);
} }
...@@ -1177,13 +1161,13 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1177,13 +1161,13 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req)
VSLb(req->vsl, SLT_HitPass, "%u", req->obj->xid); VSLb(req->vsl, SLT_HitPass, "%u", req->obj->xid);
(void)HSH_Deref(&wrk->stats, NULL, &req->obj); (void)HSH_Deref(&wrk->stats, NULL, &req->obj);
AZ(req->objcore); AZ(req->objcore);
sp->step = STP_PASS; req->sp->step = STP_PASS;
return (0); return (0);
} }
wrk->stats.cache_hit++; wrk->stats.cache_hit++;
VSLb(req->vsl, SLT_Hit, "%u", req->obj->xid); VSLb(req->vsl, SLT_Hit, "%u", req->obj->xid);
sp->step = STP_HIT; req->sp->step = STP_HIT;
return (0); return (0);
} }
...@@ -1202,11 +1186,10 @@ DOT ...@@ -1202,11 +1186,10 @@ DOT
*/ */
static int static int
cnt_miss(struct sess *sp, struct worker *wrk, struct req *req) cnt_miss(struct worker *wrk, struct req *req)
{ {
struct busyobj *bo; struct busyobj *bo;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC); CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
...@@ -1228,13 +1211,11 @@ cnt_miss(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1228,13 +1211,11 @@ cnt_miss(struct sess *sp, struct worker *wrk, struct req *req)
http_SetHeader(bo->bereq, "Accept-Encoding: gzip"); http_SetHeader(bo->bereq, "Accept-Encoding: gzip");
} }
assert(req->sp == sp);
VCL_miss_method(req); VCL_miss_method(req);
assert(req->sp == sp);
if (req->handling == VCL_RET_FETCH) { if (req->handling == VCL_RET_FETCH) {
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
sp->step = STP_FETCH; req->sp->step = STP_FETCH;
return (0); return (0);
} }
...@@ -1245,13 +1226,13 @@ cnt_miss(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1245,13 +1226,13 @@ cnt_miss(struct sess *sp, struct worker *wrk, struct req *req)
switch(req->handling) { switch(req->handling) {
case VCL_RET_ERROR: case VCL_RET_ERROR:
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
break; break;
case VCL_RET_PASS: case VCL_RET_PASS:
sp->step = STP_PASS; req->sp->step = STP_PASS;
break; break;
case VCL_RET_RESTART: case VCL_RET_RESTART:
sp->step = STP_RESTART; req->sp->step = STP_RESTART;
break; break;
default: default:
WRONG("Illegal action in vcl_miss{}"); WRONG("Illegal action in vcl_miss{}");
...@@ -1277,11 +1258,10 @@ XDOT err_pass [label="ERROR",shape=plaintext] ...@@ -1277,11 +1258,10 @@ XDOT err_pass [label="ERROR",shape=plaintext]
*/ */
static int static int
cnt_pass(struct sess *sp, struct worker *wrk, struct req *req) cnt_pass(struct worker *wrk, struct req *req)
{ {
struct busyobj *bo; struct busyobj *bo;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC); CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
...@@ -1291,24 +1271,22 @@ cnt_pass(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1291,24 +1271,22 @@ cnt_pass(struct sess *sp, struct worker *wrk, struct req *req)
req->busyobj = VBO_GetBusyObj(wrk); req->busyobj = VBO_GetBusyObj(wrk);
bo = req->busyobj; bo = req->busyobj;
bo->vsl->wid = sp->vsl_id; bo->vsl->wid = req->sp->vsl_id;
bo->refcount = 2; bo->refcount = 2;
HTTP_Setup(bo->bereq, bo->ws, bo->vsl, HTTP_Bereq); HTTP_Setup(bo->bereq, bo->ws, bo->vsl, HTTP_Bereq);
http_FilterReq(req, HTTPH_R_PASS); http_FilterReq(req, HTTPH_R_PASS);
assert(req->sp == sp);
VCL_pass_method(req); VCL_pass_method(req);
assert(req->sp == sp);
if (req->handling == VCL_RET_ERROR) { if (req->handling == VCL_RET_ERROR) {
http_Teardown(bo->bereq); http_Teardown(bo->bereq);
VBO_DerefBusyObj(wrk, &req->busyobj); VBO_DerefBusyObj(wrk, &req->busyobj);
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
return (0); return (0);
} }
assert(req->handling == VCL_RET_PASS); assert(req->handling == VCL_RET_PASS);
wrk->acct_tmp.pass++; wrk->acct_tmp.pass++;
sp->step = STP_FETCH; req->sp->step = STP_FETCH;
req->objcore = HSH_NewObjCore(wrk); req->objcore = HSH_NewObjCore(wrk);
req->objcore->busyobj = bo; req->objcore->busyobj = bo;
...@@ -1341,11 +1319,10 @@ DOT err_pipe [label="ERROR",shape=plaintext] ...@@ -1341,11 +1319,10 @@ DOT err_pipe [label="ERROR",shape=plaintext]
*/ */
static int static int
cnt_pipe(struct sess *sp, struct worker *wrk, struct req *req) cnt_pipe(struct worker *wrk, struct req *req)
{ {
struct busyobj *bo; struct busyobj *bo;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC); CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
...@@ -1354,13 +1331,11 @@ cnt_pipe(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1354,13 +1331,11 @@ cnt_pipe(struct sess *sp, struct worker *wrk, struct req *req)
wrk->acct_tmp.pipe++; wrk->acct_tmp.pipe++;
req->busyobj = VBO_GetBusyObj(wrk); req->busyobj = VBO_GetBusyObj(wrk);
bo = req->busyobj; bo = req->busyobj;
bo->vsl->wid = sp->vsl_id; bo->vsl->wid = req->sp->vsl_id;
HTTP_Setup(bo->bereq, bo->ws, bo->vsl, HTTP_Bereq); HTTP_Setup(bo->bereq, bo->ws, bo->vsl, HTTP_Bereq);
http_FilterReq(req, 0); http_FilterReq(req, 0);
assert(req->sp == sp);
VCL_pipe_method(req); VCL_pipe_method(req);
assert(req->sp == sp);
if (req->handling == VCL_RET_ERROR) if (req->handling == VCL_RET_ERROR)
INCOMPL(); INCOMPL();
...@@ -1386,20 +1361,19 @@ DOT restart -> recv [color=purple] ...@@ -1386,20 +1361,19 @@ DOT restart -> recv [color=purple]
*/ */
static int static int
cnt_restart(struct sess *sp, const struct worker *wrk, struct req *req) cnt_restart(const struct worker *wrk, struct req *req)
{ {
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
req->director = NULL; req->director = NULL;
if (++req->restarts >= cache_param->max_restarts) { if (++req->restarts >= cache_param->max_restarts) {
req->err_code = 503; req->err_code = 503;
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
} else { } else {
req->err_code = 0; req->err_code = 0;
sp->step = STP_RECV; req->sp->step = STP_RECV;
} }
return (0); return (0);
} }
...@@ -1433,12 +1407,11 @@ DOT hash -> lookup [label="hash",style=bold,color=green] ...@@ -1433,12 +1407,11 @@ DOT hash -> lookup [label="hash",style=bold,color=green]
*/ */
static int static int
cnt_recv(struct sess *sp, const struct worker *wrk, struct req *req) cnt_recv(const struct worker *wrk, struct req *req)
{ {
unsigned recv_handling; unsigned recv_handling;
struct SHA256Context sha256ctx; struct SHA256Context sha256ctx;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC); CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
...@@ -1457,9 +1430,7 @@ cnt_recv(struct sess *sp, const struct worker *wrk, struct req *req) ...@@ -1457,9 +1430,7 @@ cnt_recv(struct sess *sp, const struct worker *wrk, struct req *req)
http_CollectHdr(req->http, H_Cache_Control); http_CollectHdr(req->http, H_Cache_Control);
assert(req->sp == sp);
VCL_recv_method(req); VCL_recv_method(req);
assert(req->sp == sp);
recv_handling = req->handling; recv_handling = req->handling;
if (cache_param->http_gzip_support && if (cache_param->http_gzip_support &&
...@@ -1475,9 +1446,7 @@ cnt_recv(struct sess *sp, const struct worker *wrk, struct req *req) ...@@ -1475,9 +1446,7 @@ cnt_recv(struct sess *sp, const struct worker *wrk, struct req *req)
req->sha256ctx = &sha256ctx; /* so HSH_AddString() can find it */ req->sha256ctx = &sha256ctx; /* so HSH_AddString() can find it */
SHA256_Init(req->sha256ctx); SHA256_Init(req->sha256ctx);
assert(req->sp == sp);
VCL_hash_method(req); VCL_hash_method(req);
assert(req->sp == sp);
assert(req->handling == VCL_RET_HASH); assert(req->handling == VCL_RET_HASH);
SHA256_Final(req->digest, req->sha256ctx); SHA256_Final(req->digest, req->sha256ctx);
req->sha256ctx = NULL; req->sha256ctx = NULL;
...@@ -1489,7 +1458,7 @@ cnt_recv(struct sess *sp, const struct worker *wrk, struct req *req) ...@@ -1489,7 +1458,7 @@ cnt_recv(struct sess *sp, const struct worker *wrk, struct req *req)
switch(recv_handling) { switch(recv_handling) {
case VCL_RET_LOOKUP: case VCL_RET_LOOKUP:
sp->step = STP_LOOKUP; req->sp->step = STP_LOOKUP;
return (0); return (0);
case VCL_RET_PIPE: case VCL_RET_PIPE:
if (req->esi_level > 0) { if (req->esi_level > 0) {
...@@ -1497,13 +1466,13 @@ cnt_recv(struct sess *sp, const struct worker *wrk, struct req *req) ...@@ -1497,13 +1466,13 @@ cnt_recv(struct sess *sp, const struct worker *wrk, struct req *req)
INCOMPL(); INCOMPL();
return (1); return (1);
} }
sp->step = STP_PIPE; req->sp->step = STP_PIPE;
return (0); return (0);
case VCL_RET_PASS: case VCL_RET_PASS:
sp->step = STP_PASS; req->sp->step = STP_PASS;
return (0); return (0);
case VCL_RET_ERROR: case VCL_RET_ERROR:
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
return (0); return (0);
default: default:
WRONG("Illegal action in vcl_recv{}"); WRONG("Illegal action in vcl_recv{}");
...@@ -1523,12 +1492,11 @@ DOT start -> DONE [label=errors] ...@@ -1523,12 +1492,11 @@ DOT start -> DONE [label=errors]
*/ */
static int static int
cnt_start(struct sess *sp, struct worker *wrk, struct req *req) cnt_start(struct worker *wrk, struct req *req)
{ {
char *p; char *p;
const char *r = "HTTP/1.1 100 Continue\r\n\r\n"; const char *r = "HTTP/1.1 100 Continue\r\n\r\n";
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AZ(req->restarts); AZ(req->restarts);
...@@ -1536,7 +1504,6 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1536,7 +1504,6 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req)
AZ(req->vcl); AZ(req->vcl);
AZ(req->esi_level); AZ(req->esi_level);
assert(!isnan(req->t_req)); assert(!isnan(req->t_req));
assert(req->sp == sp);
/* Update stats of various sorts */ /* Update stats of various sorts */
wrk->stats.client_req++; wrk->stats.client_req++;
...@@ -1545,7 +1512,7 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1545,7 +1512,7 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req)
/* Assign XID and log */ /* Assign XID and log */
req->xid = ++xids; /* XXX not locked */ req->xid = ++xids; /* XXX not locked */
VSLb(req->vsl, SLT_ReqStart, "%s %s %u", VSLb(req->vsl, SLT_ReqStart, "%s %s %u",
sp->addr, sp->port, req->xid); req->sp->addr, req->sp->port, req->xid);
/* Borrow VCL reference from worker thread */ /* Borrow VCL reference from worker thread */
VCL_Refresh(&wrk->vcl); VCL_Refresh(&wrk->vcl);
...@@ -1559,7 +1526,7 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1559,7 +1526,7 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req)
/* If we could not even parse the request, just close */ /* If we could not even parse the request, just close */
if (req->err_code == 400) { if (req->err_code == 400) {
SES_Close(sp, "junk"); SES_Close(req->sp, "junk");
return (1); return (1);
} }
...@@ -1574,8 +1541,8 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1574,8 +1541,8 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req)
if (req->err_code == 0 && http_GetHdr(req->http, H_Expect, &p)) { if (req->err_code == 0 && http_GetHdr(req->http, H_Expect, &p)) {
if (strcasecmp(p, "100-continue")) { if (strcasecmp(p, "100-continue")) {
req->err_code = 417; req->err_code = 417;
} else if (strlen(r) != write(sp->fd, r, strlen(r))) { } else if (strlen(r) != write(req->sp->fd, r, strlen(r))) {
SES_Close(sp, "remote closed"); SES_Close(req->sp, "remote closed");
return (1); return (1);
} }
} }
...@@ -1587,9 +1554,9 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req) ...@@ -1587,9 +1554,9 @@ cnt_start(struct sess *sp, struct worker *wrk, struct req *req)
HTTP_Copy(req->http0, req->http); /* Copy for restart/ESI use */ HTTP_Copy(req->http0, req->http); /* Copy for restart/ESI use */
if (req->err_code) if (req->err_code)
sp->step = STP_ERROR; req->sp->step = STP_ERROR;
else else
sp->step = STP_RECV; req->sp->step = STP_RECV;
return (0); return (0);
} }
......
...@@ -30,17 +30,17 @@ ...@@ -30,17 +30,17 @@
/*lint -save -e525 -e539 */ /*lint -save -e525 -e539 */
SESS_STEP(wait, WAIT, (sp, sp->wrk, sp->req)) SESS_STEP(wait, WAIT, (sp, sp->wrk, sp->req))
SESS_STEP(restart, RESTART, (sp, sp->wrk, sp->req)) SESS_STEP(restart, RESTART, (wrk, req))
SESS_STEP(recv, RECV, (sp, sp->wrk, sp->req)) SESS_STEP(recv, RECV, (wrk, req))
SESS_STEP(start, START, (sp, sp->wrk, sp->req)) SESS_STEP(start, START, (wrk, req))
SESS_STEP(pipe, PIPE, (sp, sp->wrk, sp->req)) SESS_STEP(pipe, PIPE, (wrk, req))
SESS_STEP(pass, PASS, (sp, sp->wrk, sp->req)) SESS_STEP(pass, PASS, (wrk, req))
SESS_STEP(lookup, LOOKUP, (sp, sp->wrk, sp->req)) SESS_STEP(lookup, LOOKUP, (wrk, req))
SESS_STEP(miss, MISS, (sp, sp->wrk, sp->req)) SESS_STEP(miss, MISS, (wrk, req))
SESS_STEP(hit, HIT, (sp, sp->wrk, sp->req)) SESS_STEP(hit, HIT, (wrk, req))
SESS_STEP(fetch, FETCH, (sp, sp->wrk, sp->req)) SESS_STEP(fetch, FETCH, (wrk, req))
SESS_STEP(fetchbody, FETCHBODY, (sp, sp->wrk, sp->req)) SESS_STEP(fetchbody, FETCHBODY, (wrk, req))
SESS_STEP(prepresp, PREPRESP, (sp, sp->wrk, sp->req)) SESS_STEP(prepresp, PREPRESP, (wrk, req))
SESS_STEP(deliver, DELIVER, (sp, sp->wrk, sp->req)) SESS_STEP(deliver, DELIVER, (wrk, req))
SESS_STEP(error, ERROR, (sp, sp->wrk, sp->req)) SESS_STEP(error, ERROR, (wrk, req))
/*lint -restore */ /*lint -restore */
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