[master] 69369f3 Tell VBF_Fetch() what we're trying to do, and have it linger until we have a usable state.

Poul-Henning Kamp phk at varnish-cache.org
Thu Aug 29 11:59:14 CEST 2013


commit 69369f3e1b0e689a494eea637d2394e5ecd1f919
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Aug 29 09:58:44 2013 +0000

    Tell VBF_Fetch() what we're trying to do, and have it linger until
    we have a usable state.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 0784b62..9b68f79 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -845,7 +845,13 @@ int EXP_NukeOne(struct busyobj *, struct lru *lru);
 void EXP_NukeLRU(struct worker *wrk, struct vsl_log *vsl, struct lru *lru);
 
 /* cache_fetch.c */
-struct busyobj *VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc, int pass);
+enum vbf_fetch_mode_e {
+	VBF_NORMAL = 0,
+	VBF_PASS = 1,
+	VBF_BACKGROUND = 2,
+};
+struct busyobj *VBF_Fetch(struct worker *wrk, struct req *req,
+    struct objcore *oc, 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 c25be1c..d928603 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -528,7 +528,8 @@ vbf_fetch_thread(struct worker *wrk, void *priv)
  */
 
 struct busyobj *
-VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc, int pass)
+VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
+    enum vbf_fetch_mode_e mode)
 {
 	struct busyobj *bo;
 
@@ -544,7 +545,8 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc, int pass)
 
 	CHECK_OBJ_NOTNULL(bo->vcl, VCL_CONF_MAGIC);
 
-	bo->do_pass = pass;
+	if (mode == VBF_PASS)
+		bo->do_pass = 1;
 
 	bo->vary = req->vary_b;
 	req->vary_b = NULL;
@@ -561,6 +563,11 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc, int pass)
 
 	if (Pool_Task(wrk->pool, &bo->fetch_task, POOL_QUEUE_FRONT))
 		vbf_fetch_thread(wrk, bo);
-	VBO_waitstate(bo, BOS_REQ_DONE);
+	if (mode == VBF_BACKGROUND) {
+		VBO_waitstate(bo, BOS_REQ_DONE);
+		VBO_DerefBusyObj(wrk, &bo);
+		return (NULL);
+	}
+	VBO_waitstate(bo, BOS_FETCHING);
 	return (bo);
 }
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 3e4dabf..29ae0e4 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -378,8 +378,6 @@ cnt_fetch(struct worker *wrk, struct req *req)
 	assert(bo->refcount > 0);
 	(void)HTTP1_DiscardReqBody(req);
 
-	VBO_waitstate(bo, BOS_FETCHING);
-
 	/* bo->do_stream is not valid until after vcl_backend_response{} */
 	if (!bo->do_stream)
 		VBO_waitstate(bo, BOS_FINISHED);
@@ -499,9 +497,6 @@ cnt_lookup(struct worker *wrk, struct req *req)
 	oh = oc->objhead;
 	CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
 
-	/* We are not prepared to do streaming yet */
-	XXXAZ(req->busyobj);
-
 	o = oc_getobj(&wrk->stats, oc);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	req->obj = o;
@@ -513,8 +508,7 @@ cnt_lookup(struct worker *wrk, struct req *req)
 	switch (wrk->handling) {
 	case VCL_RET_DELIVER:
 		if (boc != NULL) {
-			req->busyobj = VBF_Fetch(wrk, req, boc, 0);
-			VBO_DerefBusyObj(wrk, &req->busyobj);
+			AZ(VBF_Fetch(wrk, req, boc, VBF_BACKGROUND));
 		} else {
 			(void)HTTP1_DiscardReqBody(req);// XXX: handle err
 		}
@@ -607,7 +601,7 @@ cnt_miss(struct worker *wrk, struct req *req)
 	wrk->stats.cache_miss++;
 
 	AN (req->objcore);
-	req->busyobj = VBF_Fetch(wrk, req, req->objcore, 0);
+	req->busyobj = VBF_Fetch(wrk, req, req->objcore, VBF_NORMAL);
 	req->objcore = NULL;
 	req->req_step = R_STP_FETCH;
 	return (REQ_FSM_MORE);
@@ -655,7 +649,7 @@ cnt_pass(struct worker *wrk, struct req *req)
 
 	oc = HSH_Private(wrk);
 	AN(oc);
-	req->busyobj = VBF_Fetch(wrk, req, oc, 1);
+	req->busyobj = VBF_Fetch(wrk, req, oc, VBF_PASS);
 	req->req_step = R_STP_FETCH;
 	return (REQ_FSM_MORE);
 }



More information about the varnish-commit mailing list