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

moving on: Pass the IMS candidate objcore to VBF and polish its

state engine a bit while here.
parent 5d50e8b5
......@@ -544,6 +544,7 @@ struct busyobj {
struct http *bereq0;
struct http *bereq;
struct http *beresp;
struct objcore *ims_objcore;
struct objcore *fetch_objcore;
struct object *fetch_obj;
struct exp exp;
......@@ -917,7 +918,7 @@ enum vbf_fetch_mode_e {
VBF_BACKGROUND = 2,
};
void VBF_Fetch(struct worker *wrk, struct req *req,
struct objcore *oc, enum vbf_fetch_mode_e);
struct objcore *oc, struct objcore *oldoc, enum vbf_fetch_mode_e);
/* cache_fetch_proc.c */
struct storage *VFP_GetStorage(struct busyobj *, ssize_t sz);
......
......@@ -119,7 +119,7 @@ vbf_stp_startfetch(struct worker *wrk, struct busyobj *bo)
if (bo->req != NULL)
vbf_release_req(bo);
(void)VFP_Error(bo, "Abandonned in vcl_backend_fetch");
return (F_STP_ABANDON);
return (F_STP_DONE);
}
assert (wrk->handling == VCL_RET_FETCH);
return (F_STP_FETCHHDR);
......@@ -222,7 +222,7 @@ vbf_stp_fetchhdr(struct worker *wrk, struct busyobj *bo)
// XXX: wrk->handling = VCL_RET_SYNTH;
}
return (F_STP_NOTYET);
INCOMPL();
}
/*--------------------------------------------------------------------
......@@ -358,7 +358,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
if (obj == NULL) {
(void)VFP_Error(bo, "Could not get storage");
VDI_CloseFd(&bo->vbc);
return (F_STP_ABANDON);
return (F_STP_DONE);
}
CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
......@@ -429,43 +429,13 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
VBO_setstate(bo, BOS_FINISHED);
VSLb(bo->vsl, SLT_Debug, "YYY REF %d %d", bo->refcount, bo->fetch_obj->objcore->refcnt);
VBO_DerefBusyObj(wrk, &bo); // XXX ?
return (F_STP_DONE);
}
/*--------------------------------------------------------------------
*/
static enum fetch_step
vbf_stp_abandon(struct worker *wrk, struct busyobj *bo)
{
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
assert(bo->state == BOS_FAILED);
assert(bo->fetch_objcore->flags & OC_F_FAILED);
VBO_DerefBusyObj(wrk, &bo); // XXX ?
return (F_STP_DONE);
}
/*--------------------------------------------------------------------
*/
static enum fetch_step
vbf_stp_notyet(void)
{
WRONG("Patience, grashopper, patience...");
NEEDLESS_RETURN(F_STP_NOTYET);
}
/*--------------------------------------------------------------------
*/
static enum fetch_step
vbf_stp_done(void)
{
WRONG("Just plain wrong");
NEEDLESS_RETURN(F_STP_NOTYET);
}
/*--------------------------------------------------------------------
......@@ -512,11 +482,18 @@ vbf_fetch_thread(struct worker *wrk, void *priv)
default:
WRONG("Illegal fetch_step");
}
if (stp != F_STP_DONE)
VSLb(bo->vsl, SLT_Debug, "%s -> %s",
vbf_step_name(bo->step), vbf_step_name(stp));
VSLb(bo->vsl, SLT_Debug, "%s -> %s",
vbf_step_name(bo->step), vbf_step_name(stp));
}
assert(WRW_IsReleased(wrk));
if (bo->state == BOS_FAILED)
assert(bo->fetch_objcore->flags & OC_F_FAILED);
if (bo->ims_objcore != NULL)
(void)HSH_DerefObjCore(&wrk->stats, &bo->ims_objcore);
VBO_DerefBusyObj(wrk, &bo);
THR_SetBusyobj(NULL);
}
......@@ -525,13 +502,14 @@ vbf_fetch_thread(struct worker *wrk, void *priv)
void
VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
enum vbf_fetch_mode_e mode)
struct objcore *oldoc, enum vbf_fetch_mode_e mode)
{
struct busyobj *bo;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
CHECK_OBJ_ORNULL(oldoc, OBJCORE_MAGIC);
bo = VBO_GetBusyObj(wrk, req);
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
......@@ -547,10 +525,14 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
bo->vary = req->vary_b;
req->vary_b = NULL;
AZ(bo->fetch_objcore);
HSH_Ref(oc);
bo->fetch_objcore = oc;
if (oldoc != NULL) {
HSH_Ref(oldoc);
bo->ims_objcore = oldoc;
}
AZ(bo->req);
bo->req = req;
......
......@@ -416,7 +416,7 @@ cnt_lookup(struct worker *wrk, struct req *req)
switch (wrk->handling) {
case VCL_RET_DELIVER:
if (boc != NULL) {
VBF_Fetch(wrk, req, boc, VBF_BACKGROUND);
VBF_Fetch(wrk, req, boc, oc, VBF_BACKGROUND);
} else {
(void)HTTP1_DiscardReqBody(req);// XXX: handle err
}
......@@ -494,7 +494,7 @@ cnt_miss(struct worker *wrk, struct req *req)
switch (wrk->handling) {
case VCL_RET_FETCH:
wrk->stats.cache_miss++;
VBF_Fetch(wrk, req, req->objcore, VBF_NORMAL);
VBF_Fetch(wrk, req, req->objcore, NULL, VBF_NORMAL);
req->req_step = R_STP_FETCH;
return (REQ_FSM_MORE);
case VCL_RET_ERROR:
......@@ -553,7 +553,7 @@ cnt_pass(struct worker *wrk, struct req *req)
req->acct_req.pass++;
req->objcore = HSH_Private(wrk);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
VBF_Fetch(wrk, req, req->objcore, VBF_PASS);
VBF_Fetch(wrk, req, req->objcore, NULL, VBF_PASS);
req->req_step = R_STP_FETCH;
break;
default:
......
......@@ -53,8 +53,6 @@ FETCH_STEP(mkbereq, MKBEREQ, (wrk, bo))
FETCH_STEP(startfetch, STARTFETCH, (wrk, bo))
FETCH_STEP(fetchhdr, FETCHHDR, (wrk, bo))
FETCH_STEP(fetch, FETCH, (wrk, bo))
FETCH_STEP(abandon, ABANDON, (wrk, bo))
FETCH_STEP(notyet, NOTYET, ())
FETCH_STEP(done, DONE, ())
#endif
......
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