[master] 98791be When we ref/deref busy oc's, act on struct boc instead of busyobj
Poul-Henning Kamp
phk at FreeBSD.org
Thu Jan 28 12:49:19 CET 2016
commit 98791be34788a626da906f5058a8335490b5e344
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Jan 20 21:00:49 2016 +0000
When we ref/deref busy oc's, act on struct boc instead of busyobj
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index a670143..f24871f 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -706,11 +706,12 @@ HSH_Ref(struct objcore *oc)
* Gain a reference on the busyobj, if the objcore has one
*/
-struct busyobj *
+struct boc *
HSH_RefBusy(const struct objcore *oc)
{
struct objhead *oh;
struct busyobj *bo;
+ struct boc *boc = NULL;
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
oh = oc->objhead;
@@ -719,10 +720,30 @@ HSH_RefBusy(const struct objcore *oc)
assert(oc->refcnt > 0);
bo = oc->busyobj;
CHECK_OBJ_ORNULL(bo, BUSYOBJ_MAGIC);
- if (bo != NULL)
- bo->boc->refcount++;
+ if (bo != NULL) {
+ CHECK_OBJ_NOTNULL(bo->boc, BOC_MAGIC);
+ boc = bo->boc;
+ assert(boc->busyobj == bo);
+ boc->refcount++;
+ }
Lck_Unlock(&oh->mtx);
- return (bo);
+ return (boc);
+}
+
+void
+HSH_DerefBusy(struct worker *wrk, struct boc **pp)
+{
+ struct boc *boc;
+ struct busyobj *bo;
+
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ AN(pp);
+ boc = *pp;
+ *pp = NULL;
+ CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
+ CHECK_OBJ_NOTNULL(boc->busyobj, BUSYOBJ_MAGIC);
+ bo = boc->busyobj;
+ VBO_DerefBusyObj(wrk, &bo);
}
/*--------------------------------------------------------------------
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 52c05b4..7fc3f1e 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -115,7 +115,7 @@ cnt_vdp(struct req *req, struct boc *boc)
static enum req_fsm_nxt
cnt_deliver(struct worker *wrk, struct req *req)
{
- struct busyobj *bo;
+ struct boc *boc;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -197,21 +197,23 @@ cnt_deliver(struct worker *wrk, struct req *req)
http_PutResponse(req->resp, "HTTP/1.1", 304, NULL);
/* Grab a ref to the bo if there is one, and hand it down */
- bo = HSH_RefBusy(req->objcore);
- if (bo != NULL) {
- if (req->esi_level == 0 && bo->boc->state == BOS_FINISHED) {
- VBO_DerefBusyObj(wrk, &bo);
- } else if (!bo->do_stream) {
- ObjWaitState(bo->boc, BOS_FINISHED);
- VBO_DerefBusyObj(wrk, &bo);
+ boc = HSH_RefBusy(req->objcore);
+ if (boc != NULL) {
+ if (req->esi_level == 0 && boc->state == BOS_FINISHED) {
+ HSH_DerefBusy(wrk, &boc);
+ } else if (!boc->busyobj->do_stream) {
+ ObjWaitState(boc, BOS_FINISHED);
+ HSH_DerefBusy(wrk, &boc);
}
}
- cnt_vdp(req, bo == NULL ? NULL : bo->boc);
+ cnt_vdp(req, boc);
/* pass+streaming, abandon fetch in case delivery terminated early */
- if (bo != NULL && req->objcore->flags & OC_F_PASS)
- bo->abandon = 1;
+ if (boc != NULL && req->objcore->flags & OC_F_PASS) {
+ CHECK_OBJ_NOTNULL(boc->busyobj, BUSYOBJ_MAGIC);
+ boc->busyobj->abandon = 1;
+ }
VSLb_ts_req(req, "Resp", W_TIM_real(wrk));
@@ -219,13 +221,13 @@ cnt_deliver(struct worker *wrk, struct req *req)
req->doclose = SC_RESP_CLOSE;
if (req->objcore->flags & (OC_F_PRIVATE | OC_F_PASS)) {
- if (bo != NULL)
- ObjWaitState(bo->boc, BOS_FINISHED);
+ if (boc != NULL)
+ ObjWaitState(boc, BOS_FINISHED);
ObjSlim(wrk, req->objcore);
}
- if (bo != NULL)
- VBO_DerefBusyObj(wrk, &bo);
+ if (boc != NULL)
+ HSH_DerefBusy(wrk, &boc);
(void)HSH_DerefObjCore(wrk, &req->objcore);
http_Teardown(req->resp);
diff --git a/bin/varnishd/hash/hash_slinger.h b/bin/varnishd/hash/hash_slinger.h
index 1fa219e..f307ba5 100644
--- a/bin/varnishd/hash/hash_slinger.h
+++ b/bin/varnishd/hash/hash_slinger.h
@@ -72,7 +72,8 @@ void HSH_Insert(struct worker *, const void *hash, struct objcore *);
void HSH_Purge(struct worker *, struct objhead *, double ttl, double grace,
double keep);
void HSH_config(const char *h_arg);
-struct busyobj *HSH_RefBusy(const struct objcore *oc);
+struct boc *HSH_RefBusy(const struct objcore *);
+void HSH_DerefBusy(struct worker *wrk, struct boc **);
struct objcore *HSH_Private(struct worker *wrk);
#ifdef VARNISH_CACHE_CHILD
diff --git a/bin/varnishd/storage/storage_simple.c b/bin/varnishd/storage/storage_simple.c
index 4b61aeb..d0a003b 100644
--- a/bin/varnishd/storage/storage_simple.c
+++ b/bin/varnishd/storage/storage_simple.c
@@ -227,7 +227,7 @@ static int __match_proto__(objiterate_f)
sml_iterator(struct worker *wrk, struct objcore *oc,
void *priv, objiterate_f *func)
{
- struct busyobj *bo;
+ struct boc *boc;
struct object *obj;
struct storage *st;
struct storage *checkpoint = NULL;
@@ -243,9 +243,9 @@ sml_iterator(struct worker *wrk, struct objcore *oc,
obj = sml_getobj(wrk, oc);
CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
- bo = HSH_RefBusy(oc);
+ boc = HSH_RefBusy(oc);
- if (bo == NULL) {
+ if (boc == NULL) {
VTAILQ_FOREACH(st, &obj->list, list)
if (func(priv, 0, st->ptr, st->len))
return (-1);
@@ -257,17 +257,17 @@ sml_iterator(struct worker *wrk, struct objcore *oc,
while (1) {
ol = len;
- nl = ObjWaitExtend(wrk, oc, bo->boc, ol);
- if (bo->boc->state == BOS_FAILED) {
+ nl = ObjWaitExtend(wrk, oc, boc, ol);
+ if (boc->state == BOS_FAILED) {
ret = -1;
break;
}
if (nl == ol) {
- if (bo->boc->state == BOS_FINISHED)
+ if (boc->state == BOS_FINISHED)
break;
continue;
}
- Lck_Lock(&bo->boc->mtx);
+ Lck_Lock(&boc->mtx);
AZ(VTAILQ_EMPTY(&obj->list));
if (checkpoint == NULL) {
st = VTAILQ_FIRST(&obj->list);
@@ -300,14 +300,14 @@ sml_iterator(struct worker *wrk, struct objcore *oc,
st = VTAILQ_NEXT(st, list);
if (st != NULL && st->len == 0)
st = NULL;
- Lck_Unlock(&bo->boc->mtx);
- assert(l > 0 || bo->boc->state == BOS_FINISHED);
+ Lck_Unlock(&boc->mtx);
+ assert(l > 0 || boc->state == BOS_FINISHED);
if (func(priv, st != NULL ? 0 : 1, p, l)) {
ret = -1;
break;
}
}
- VBO_DerefBusyObj(wrk, &bo);
+ HSH_DerefBusy(wrk, &boc);
return (ret);
}
More information about the varnish-commit
mailing list