[master] c0f7ed6 More req->obj to req->objcore movement
Poul-Henning Kamp
phk at FreeBSD.org
Tue Aug 5 15:51:02 CEST 2014
commit c0f7ed645f5be3be0b41710c6f978ce6a4f31538
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Aug 5 13:50:44 2014 +0000
More req->obj to req->objcore movement
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index af290cd..6c5251b 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -649,6 +649,7 @@ struct req {
struct ws ws[1];
struct object *obj;
struct objcore *objcore;
+ struct objcore *ims_oc;
/* Lookup stuff */
struct SHA256Context *sha256ctx;
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index ed30dd0..596a68d 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -91,14 +91,14 @@ cnt_deliver(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
- CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
- CHECK_OBJ_NOTNULL(req->obj->objcore, OBJCORE_MAGIC);
- assert(req->obj->objcore == req->objcore);
CHECK_OBJ_NOTNULL(req->objcore->objhead, OBJHEAD_MAGIC);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
assert(WRW_IsReleased(wrk));
+ req->obj = ObjGetObj(req->objcore, &wrk->stats);
+ CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
+
assert(req->objcore->refcnt > 0);
if (req->objcore->exp_flags & OC_EF_EXP)
@@ -308,8 +308,6 @@ cnt_fetch(struct worker *wrk, struct req *req)
return (REQ_FSM_MORE);
}
- req->obj = ObjGetObj(req->objcore, &wrk->stats);
- req->err_code = http_GetStatus(req->obj->http);
req->req_step = R_STP_DELIVER;
return (REQ_FSM_MORE);
}
@@ -346,8 +344,6 @@ static enum req_fsm_nxt
cnt_lookup(struct worker *wrk, struct req *req)
{
struct objcore *oc, *boc;
- struct object *o;
- struct objhead *oh;
enum lookup_e lr;
int had_objhead = 0;
@@ -390,6 +386,7 @@ cnt_lookup(struct worker *wrk, struct req *req)
/* Found nothing */
VSLb(req->vsl, SLT_Debug, "XXXX MISS");
AZ(oc);
+ AZ(req->obj);
AN(boc);
AN(boc->flags & OC_F_BUSY);
req->objcore = boc;
@@ -401,27 +398,19 @@ cnt_lookup(struct worker *wrk, struct req *req)
AZ(oc->flags & OC_F_BUSY);
req->objcore = oc;
- o = ObjGetObj(oc, &wrk->stats);
- CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
- req->obj = o;
-
if (oc->flags & OC_F_PASS) {
/* Found a hit-for-pass */
VSLb(req->vsl, SLT_Debug, "XXXX HIT-FOR-PASS");
VSLb(req->vsl, SLT_HitPass, "%u",
VXID(ObjGetXID(req->objcore, &wrk->stats)));
AZ(boc);
- assert(req->obj->objcore == req->objcore);
+ AZ(req->obj);
(void)HSH_DerefObjCore(&wrk->stats, &req->objcore);
- req->obj = NULL;
wrk->stats.cache_hitpass++;
req->req_step = R_STP_PASS;
return (REQ_FSM_MORE);
}
- oh = oc->objhead;
- CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
-
VSLb(req->vsl, SLT_Hit, "%u",
VXID(ObjGetXID(req->objcore, &wrk->stats)));
@@ -441,13 +430,13 @@ cnt_lookup(struct worker *wrk, struct req *req)
req->req_step = R_STP_DELIVER;
return (REQ_FSM_MORE);
case VCL_RET_FETCH:
+ AZ(req->obj);
if (boc != NULL) {
req->objcore = boc;
+ req->ims_oc = oc;
req->req_step = R_STP_MISS;
} else {
- assert(req->obj->objcore == req->objcore);
(void)HSH_DerefObjCore(&wrk->stats, &req->objcore);
- req->obj = NULL;
/*
* We don't have a busy object, so treat this
* like a pass
@@ -473,9 +462,8 @@ cnt_lookup(struct worker *wrk, struct req *req)
}
/* Drop our object, we won't need it */
- assert(req->obj->objcore == req->objcore);
+ AZ(req->obj);
(void)HSH_DerefObjCore(&wrk->stats, &req->objcore);
- req->obj = NULL;
if (boc != NULL) {
(void)HSH_DerefObjCore(&wrk->stats, &boc);
@@ -502,25 +490,20 @@ DOT
static enum req_fsm_nxt
cnt_miss(struct worker *wrk, struct req *req)
{
- struct object *o;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
- o = req->obj;
- req->obj = NULL;
-
VCL_miss_method(req->vcl, wrk, req, NULL, req->http->ws);
switch (wrk->handling) {
case VCL_RET_FETCH:
wrk->stats.cache_miss++;
- VBF_Fetch(wrk, req, req->objcore,
- o == NULL ? NULL : o->objcore, VBF_NORMAL);
+ VBF_Fetch(wrk, req, req->objcore, req->ims_oc, VBF_NORMAL);
req->req_step = R_STP_FETCH;
- if (o != NULL)
- (void)HSH_DerefObj(&wrk->stats, &o);
+ if (req->ims_oc != NULL)
+ (void)HSH_DerefObjCore(&wrk->stats, &req->ims_oc);
return (REQ_FSM_MORE);
case VCL_RET_SYNTH:
req->req_step = R_STP_SYNTH;
@@ -535,8 +518,8 @@ cnt_miss(struct worker *wrk, struct req *req)
WRONG("Illegal return from vcl_miss{}");
}
VRY_Clear(req);
- if (o != NULL)
- (void)HSH_DerefObj(&wrk->stats, &o);
+ if (req->ims_oc != NULL)
+ (void)HSH_DerefObjCore(&wrk->stats, &req->ims_oc);
AZ(HSH_DerefObjCore(&wrk->stats, &req->objcore));
return (REQ_FSM_MORE);
}
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index 7e48a86..db1feb3 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -432,8 +432,9 @@ vcl_call_method(struct worker *wrk, struct req *req, struct busyobj *bo,
ctx.http_req = req->http;
ctx.http_resp = req->resp;
ctx.req = req;
- if (req->obj)
- ctx.http_obj = req->obj->http;
+ if (method == VCL_MET_HIT)
+ ctx.http_obj =
+ ObjGetObj(req->objcore, &wrk->stats)->http;
}
if (bo != NULL) {
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
More information about the varnish-commit
mailing list