[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