[master] 4a918fa Move busyobj allocation into the VBF code.
Poul-Henning Kamp
phk at varnish-cache.org
Thu Aug 15 12:58:09 CEST 2013
commit 4a918fa1647bfdd2871f86b038567b0d843e3359
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Aug 15 10:52:10 2013 +0000
Move busyobj allocation into the VBF code.
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 02d5b21..5066281 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -838,7 +838,7 @@ int EXP_NukeOne(struct busyobj *, struct lru *lru);
void EXP_NukeLRU(struct worker *wrk, struct vsl_log *vsl, struct lru *lru);
/* cache_fetch.c */
-void VBF_Fetch(struct worker *wrk, struct req *req);
+struct busyobj *VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc, int pass);
/* 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 e814522..19ccc30 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -506,23 +506,31 @@ vbf_fetch_thread(struct worker *wrk, void *priv)
/*--------------------------------------------------------------------
*/
-void
-VBF_Fetch(struct worker *wrk, struct req *req)
+struct busyobj *
+VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc, int pass)
{
struct busyobj *bo;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
- CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
+ CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
- bo = req->busyobj;
+ bo = VBO_GetBusyObj(wrk, req);
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
- assert(bo->refcount == 2);
+ bo->refcount = 2;
+
+ oc->busyobj = bo;
+
+ assert(bo->refcount >= 1);
CHECK_OBJ_NOTNULL(bo->vcl, VCL_CONF_MAGIC);
+ bo->do_pass = pass;
+
+ bo->vary = req->vary_b;
+ req->vary_b = NULL;
+
AZ(bo->fetch_objcore);
- bo->fetch_objcore = req->objcore;
- req->objcore = NULL;
+ bo->fetch_objcore = oc;
AZ(bo->req);
bo->req = req;
@@ -536,4 +544,5 @@ VBF_Fetch(struct worker *wrk, struct req *req)
printf("XXX\n");
(void)usleep(100000);
}
+ return (bo);
}
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 8010016..ee8e786 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -336,7 +336,7 @@ cnt_error(struct worker *wrk, struct req *req)
}
/*--------------------------------------------------------------------
- * Prepare to fetch body from backend
+ * Initiated a fetch (pass/miss) which we intend to deliver
*
DOT subgraph xcluster_body {
DOT fetch [
@@ -355,12 +355,8 @@ cnt_fetch(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
- AN(req->busyobj);
- AN(req->objcore);
req->acct_req.fetch++;
- VBF_Fetch(wrk, req);
AN(req->busyobj);
- AZ(req->objcore);
assert(req->busyobj->refcount > 0);
(void)HTTP1_DiscardReqBody(req);
while (req->busyobj->state < BOS_FAILED) {
@@ -555,7 +551,6 @@ DOT
static enum req_fsm_nxt
cnt_miss(struct worker *wrk, struct req *req)
{
- struct busyobj *bo;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -564,32 +559,22 @@ cnt_miss(struct worker *wrk, struct req *req)
AZ(req->obj);
AZ(req->busyobj);
- /*
- * We optimistically expect to need this most of the time
- * (This allows us to put the predictive Vary directly on the bo->ws)
- */
- bo = VBO_GetBusyObj(wrk, req);
- CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
- req->busyobj = bo;
- bo->vary = req->vary_b;
- req->vary_b = NULL;
-
VCL_miss_method(req->vcl, wrk, req, NULL, req->http->ws);
switch (wrk->handling) {
case VCL_RET_ERROR:
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ free(req->vary_b);
AZ(HSH_Deref(&wrk->stats, req->objcore, NULL));
req->objcore = NULL;
req->req_step = R_STP_ERROR;
return (REQ_FSM_MORE);
case VCL_RET_RESTART:
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ free(req->vary_b);
AZ(HSH_Deref(&wrk->stats, req->objcore, NULL));
req->objcore = NULL;
req->req_step = R_STP_RESTART;
return (REQ_FSM_MORE);
case VCL_RET_PASS:
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ free(req->vary_b);
AZ(HSH_Deref(&wrk->stats, req->objcore, NULL));
req->objcore = NULL;
req->req_step = R_STP_PASS;
@@ -600,13 +585,11 @@ cnt_miss(struct worker *wrk, struct req *req)
WRONG("wrong return from vcl_miss{}");
}
- CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
-
- AN (req->objcore);
wrk->stats.cache_miss++;
- req->objcore->busyobj = bo;
- bo->refcount = 2; /* One ref for req, one for vbf_fetch_body */
+ AN (req->objcore);
+ req->busyobj = VBF_Fetch(wrk, req, req->objcore, 0);
+ req->objcore = NULL;
req->req_step = R_STP_FETCH;
return (REQ_FSM_MORE);
}
@@ -631,7 +614,6 @@ XDOT err_pass [label="ERROR",shape=plaintext]
static enum req_fsm_nxt
cnt_pass(struct worker *wrk, struct req *req)
{
- struct busyobj *bo;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -651,14 +633,10 @@ cnt_pass(struct worker *wrk, struct req *req)
assert (wrk->handling == VCL_RET_FETCH);
req->acct_req.pass++;
- bo = VBO_GetBusyObj(wrk, req);
- CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
- req->busyobj = bo;
- bo->do_pass = 1;
req->objcore = HSH_NewObjCore(wrk);
-
- req->objcore->busyobj = bo;
- bo->refcount = 2; /* One ref for req, one for vbf_fetch_body */
+ AN(req->objcore);
+ req->busyobj = VBF_Fetch(wrk, req, req->objcore, 1);
+ req->objcore = NULL;
req->req_step = R_STP_FETCH;
return (REQ_FSM_MORE);
}
diff --git a/bin/varnishtest/tests/c00012.vtc b/bin/varnishtest/tests/c00012.vtc
index 79185e1..570fc93 100644
--- a/bin/varnishtest/tests/c00012.vtc
+++ b/bin/varnishtest/tests/c00012.vtc
@@ -25,7 +25,7 @@ client c1 {
rxresp
expect resp.status == 200
expect resp.bodylen == 7
- expect resp.http.x-varnish == "1004"
+ expect resp.http.x-varnish == "1003"
}
client c1 -run
More information about the varnish-commit
mailing list