[master] d91c487 moving on: Pass the IMS candidate objcore to VBF and polish its state engine a bit while here.
Poul-Henning Kamp
phk at varnish-cache.org
Wed Sep 11 15:09:11 CEST 2013
commit d91c487007f587534235104527f7ce1d7a47b522
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Sep 11 13:08:36 2013 +0000
moving on: Pass the IMS candidate objcore to VBF and polish its
state engine a bit while here.
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index c911933..19c12c7 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -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);
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index acff988..b1219b5 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -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;
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index b2e2b72..02e7bcb 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -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:
diff --git a/include/tbl/steps.h b/include/tbl/steps.h
index 886f4ac..b203503 100644
--- a/include/tbl/steps.h
+++ b/include/tbl/steps.h
@@ -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
More information about the varnish-commit
mailing list