[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