[master] 5d43251 Only drop objcore->boc when the refcount goes to zero.

Poul-Henning Kamp phk at FreeBSD.org
Thu Jan 28 12:49:19 CET 2016


commit 5d4325176d8541134f6190fd630177a497694b21
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Jan 20 23:24:45 2016 +0000

    Only drop objcore->boc when the refcount goes to zero.

diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
index 45a6968..809138e 100644
--- a/bin/varnishd/cache/cache_busyobj.c
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -157,8 +157,6 @@ void
 VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
 {
 	struct busyobj *bo;
-	struct objcore *oc = NULL;
-	unsigned r;
 
 	CHECK_OBJ_ORNULL(wrk, WORKER_MAGIC);
 	AN(pbo);
@@ -166,23 +164,6 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
 	*pbo = NULL;
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	CHECK_OBJ_ORNULL(bo->fetch_objcore, OBJCORE_MAGIC);
-	if (bo->fetch_objcore != NULL) {
-		oc = bo->fetch_objcore;
-		CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
-		CHECK_OBJ_NOTNULL(oc->objhead, OBJHEAD_MAGIC);
-		Lck_Lock(&oc->objhead->mtx);
-		assert(bo->boc->refcount > 0);
-		r = --bo->boc->refcount;
-		Lck_Unlock(&oc->objhead->mtx);
-	} else {
-		Lck_Lock(&bo->boc->mtx);
-		assert(bo->boc->refcount > 0);
-		r = --bo->boc->refcount;
-		Lck_Unlock(&bo->boc->mtx);
-	}
-
-	if (r)
-		return;
 
 	AZ(bo->htc);
 	AZ(bo->stale_oc);
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 3087972..e7dc558 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -950,13 +950,13 @@ vbf_fetch_thread(struct worker *wrk, void *priv)
 		VSLb(bo->vsl, SLT_Length, "%ju",
 		    (uintmax_t)ObjGetLen(bo->wrk, bo->fetch_objcore));
 	}
-	AZ(bo->fetch_objcore->boc);
+	// AZ(bo->fetch_objcore->boc);	// XXX
 
 	if (bo->stale_oc != NULL)
 		(void)HSH_DerefObjCore(wrk, &bo->stale_oc);
 
 	wrk->vsl = NULL;
-	VBO_DerefBusyObj(wrk, &bo);
+	HSH_DerefBusy(wrk, bo->fetch_objcore);
 	THR_SetBusyobj(NULL);
 }
 
@@ -1028,7 +1028,7 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
 		(void)vbf_stp_fail(req->wrk, bo);
 		if (bo->stale_oc != NULL)
 			(void)HSH_DerefObjCore(wrk, &bo->stale_oc);
-		VBO_DerefBusyObj(wrk, &bo_fetch);
+		HSH_DerefBusy(wrk, bo->fetch_objcore);
 	} else {
 		bo_fetch = NULL; /* ref transferred to fetch thread */
 		if (mode == VBF_BACKGROUND) {
@@ -1044,6 +1044,6 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
 	}
 	AZ(bo_fetch);
 	VSLb_ts_req(req, "Fetch", W_TIM_real(wrk));
-	VBO_DerefBusyObj(wrk, &bo);
+	HSH_DerefBusy(wrk, bo->fetch_objcore);
 	THR_SetBusyobj(NULL);
 }
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 0e6f269..ddd8279 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -623,7 +623,6 @@ HSH_Fail(struct objcore *oc)
 	Lck_Lock(&oh->mtx);
 	oc->flags |= OC_F_FAILED;
 	oc->flags &= ~OC_F_INCOMPLETE;
-	oc->boc = NULL;
 	Lck_Unlock(&oh->mtx);
 }
 
@@ -641,7 +640,6 @@ HSH_Complete(struct objcore *oc)
 	CHECK_OBJ(oh, OBJHEAD_MAGIC);
 
 	Lck_Lock(&oh->mtx);
-	oc->boc = NULL;
 	oc->flags &= ~OC_F_INCOMPLETE;
 	Lck_Unlock(&oh->mtx);
 }
@@ -727,19 +725,24 @@ HSH_RefBusy(const struct objcore *oc)
 }
 
 void
-HSH_DerefBusy(struct worker *wrk, struct boc **pp)
+HSH_DerefBusy(struct worker *wrk, struct objcore *oc)
 {
 	struct boc *boc;
-	struct busyobj *bo;
+	unsigned r;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	AN(pp);
-	boc = *pp;
-	*pp = NULL;
+	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+	boc = oc->boc;
 	CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
 	CHECK_OBJ_NOTNULL(boc->busyobj, BUSYOBJ_MAGIC);
-	bo = boc->busyobj;
-	VBO_DerefBusyObj(wrk, &bo);
+	Lck_Lock(&oc->objhead->mtx);
+	assert(boc->refcount > 0);
+	r = --boc->refcount;
+	if (r == 0)
+		oc->boc = NULL;
+	Lck_Unlock(&oc->objhead->mtx);
+	if (r == 0)
+		VBO_DerefBusyObj(wrk, &boc->busyobj);
 }
 
 /*--------------------------------------------------------------------
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index dde710c..4bb06d8 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -200,10 +200,12 @@ cnt_deliver(struct worker *wrk, struct req *req)
 	boc = HSH_RefBusy(req->objcore);
 	if (boc != NULL) {
 		if (req->esi_level == 0 && boc->state == BOS_FINISHED) {
-			HSH_DerefBusy(wrk, &boc);
+			HSH_DerefBusy(wrk, req->objcore);
+			boc = NULL;
 		} else if (!boc->busyobj->do_stream) {
 			ObjWaitState(boc, BOS_FINISHED);
-			HSH_DerefBusy(wrk, &boc);
+			HSH_DerefBusy(wrk, req->objcore);
+			boc = NULL;
 		}
 	}
 
@@ -227,7 +229,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
 	}
 
 	if (boc != NULL)
-		HSH_DerefBusy(wrk, &boc);
+		HSH_DerefBusy(wrk, req->objcore);
 
 	(void)HSH_DerefObjCore(wrk, &req->objcore);
 	http_Teardown(req->resp);
@@ -600,6 +602,7 @@ cnt_pipe(struct worker *wrk, struct req *req)
 	if (VDI_Http1Pipe(req, bo) < 0)
 		VSLb(bo->vsl, SLT_VCL_Error, "Backend does not support pipe");
 	http_Teardown(bo->bereq);
+bo->boc->refcount = 0;
 	VBO_DerefBusyObj(wrk, &bo);
 	THR_SetBusyobj(NULL);
 	return (REQ_FSM_DONE);
diff --git a/bin/varnishd/hash/hash_slinger.h b/bin/varnishd/hash/hash_slinger.h
index f307ba5..384b5af 100644
--- a/bin/varnishd/hash/hash_slinger.h
+++ b/bin/varnishd/hash/hash_slinger.h
@@ -73,7 +73,7 @@ void HSH_Purge(struct worker *, struct objhead *, double ttl, double grace,
     double keep);
 void HSH_config(const char *h_arg);
 struct boc *HSH_RefBusy(const struct objcore *);
-void HSH_DerefBusy(struct worker *wrk, struct boc **);
+void HSH_DerefBusy(struct worker *wrk, struct objcore *);
 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 5f0ea1b..8d313fb 100644
--- a/bin/varnishd/storage/storage_simple.c
+++ b/bin/varnishd/storage/storage_simple.c
@@ -307,7 +307,7 @@ sml_iterator(struct worker *wrk, struct objcore *oc,
 			break;
 		}
 	}
-	HSH_DerefBusy(wrk, &boc);
+	HSH_DerefBusy(wrk, oc);
 	return (ret);
 }
 



More information about the varnish-commit mailing list