[master] 3479b0d Move VBO_*() for state management of objcores being filled to OBJ*().

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


commit 3479b0d8305a86bc452cc2848bf7e63a055fa6c8
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Jan 19 10:54:20 2016 +0000

    Move VBO_*() for state management of objcores being filled to OBJ*().

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 951e438..d314942 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -680,10 +680,6 @@ double BAN_Time(const struct ban *ban);
 /* cache_busyobj.c */
 struct busyobj *VBO_GetBusyObj(struct worker *, const struct req *);
 void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj);
-void VBO_extend(struct worker *, struct objcore *, struct boc *, ssize_t);
-ssize_t VBO_waitlen(struct worker *, struct objcore *, struct boc *, ssize_t l);
-void VBO_setstate(struct boc *, enum busyobj_state_e next);
-void VBO_waitstate(struct boc *, enum busyobj_state_e want);
 
 /* cache_cli.c [CLI] */
 extern pthread_t cli_thread;
@@ -854,7 +850,10 @@ typedef int objiterate_f(void *priv, int flush, const void *ptr, ssize_t len);
 int ObjIterate(struct worker *, struct objcore *,
     void *priv, objiterate_f *func);
 int ObjGetSpace(struct worker *, struct objcore *, ssize_t *sz, uint8_t **ptr);
-void ObjExtend(struct worker *, struct objcore *, ssize_t l);
+void ObjExtend(struct worker *, struct objcore *, struct boc *, ssize_t l);
+ssize_t ObjWaitExtend(struct worker *, struct objcore *, struct boc *, ssize_t l);
+void ObjSetState(struct boc *, enum busyobj_state_e next);
+void ObjWaitState(struct boc *, enum busyobj_state_e want);
 void ObjTrimStore(struct worker *, struct objcore *);
 void ObjTouch(struct worker *wrk, struct objcore *oc, double now);
 unsigned ObjGetXID(struct worker *, struct objcore *);
diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
index f970442..c7c562b 100644
--- a/bin/varnishd/cache/cache_busyobj.c
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -225,71 +225,3 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
 
 	vbo_Free(&bo);
 }
-
-void
-VBO_extend(struct worker *wrk, struct objcore *oc, struct boc *boc,
-    ssize_t l)
-{
-
-	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
-	CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
-	if (l == 0)
-		return;
-	assert(l > 0);
-	Lck_Lock(&boc->mtx);
-	ObjExtend(wrk, oc, l);
-	AZ(pthread_cond_broadcast(&boc->cond));
-	Lck_Unlock(&boc->mtx);
-}
-
-ssize_t
-VBO_waitlen(struct worker *wrk, struct objcore *oc, struct boc *boc,
-    ssize_t l)
-{
-	ssize_t rv;
-
-	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
-	CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
-	Lck_Lock(&boc->mtx);
-	rv = ObjGetLen(wrk, oc);
-	while (1) {
-		assert(l <= rv || boc->state == BOS_FAILED);
-		if (rv > l || boc->state >= BOS_FINISHED)
-			break;
-		(void)Lck_CondWait(&boc->cond, &boc->mtx, 0);
-		rv = ObjGetLen(wrk, oc);
-	}
-	Lck_Unlock(&boc->mtx);
-	return (rv);
-}
-
-void
-VBO_setstate(struct boc *boc, enum busyobj_state_e next)
-{
-
-	CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
-
-	// assert(bo->do_stream || next != BOS_STREAM);
-	assert(next > boc->state);
-	Lck_Lock(&boc->mtx);
-	boc->state = next;
-	AZ(pthread_cond_broadcast(&boc->cond));
-	Lck_Unlock(&boc->mtx);
-}
-
-void
-VBO_waitstate(struct boc *boc, enum busyobj_state_e want)
-{
-
-	CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
-
-	Lck_Lock(&boc->mtx);
-	while (1) {
-		if (boc->state >= want)
-			break;
-		(void)Lck_CondWait(&boc->cond, &boc->mtx, 0);
-	}
-	Lck_Unlock(&boc->mtx);
-}
diff --git a/bin/varnishd/cache/cache_esi_deliver.c b/bin/varnishd/cache/cache_esi_deliver.c
index 90d7e78..e7bc423 100644
--- a/bin/varnishd/cache/cache_esi_deliver.c
+++ b/bin/varnishd/cache/cache_esi_deliver.c
@@ -689,7 +689,7 @@ ved_stripgzip(struct req *req, struct busyobj *bo)
 
 	/* XXX: Is this really required ? */
 	if (bo != NULL)
-		VBO_waitstate(bo->boc, BOS_FINISHED);
+		ObjWaitState(bo->boc, BOS_FINISHED);
 
 	AN(ObjCheckFlag(req->wrk, req->objcore, OF_GZIPED));
 
diff --git a/bin/varnishd/cache/cache_esi_fetch.c b/bin/varnishd/cache/cache_esi_fetch.c
index bce3e45..e3a50db 100644
--- a/bin/varnishd/cache/cache_esi_fetch.c
+++ b/bin/varnishd/cache/cache_esi_fetch.c
@@ -95,8 +95,10 @@ vfp_vep_callback(struct vfp_ctx *vc, void *priv, ssize_t l, enum vgz_flag flg)
 		VGZ_Obuf(vef->vgz, ptr, dl);
 		i = VGZ_Gzip(vef->vgz, &dp, &dl, flg);
 		VGZ_UpdateObj(vc, vef->vgz, VUA_UPDATE);
-		vef->tot += dl;
-		VFP_Extend(vc, dl);
+		if (dl > 0) {
+			vef->tot += dl;
+			VFP_Extend(vc, dl);
+		}
 	} while (i != VGZ_ERROR &&
 	    (!VGZ_IbufEmpty(vef->vgz) || VGZ_ObufFull(vef->vgz)));
 	assert(i == VGZ_ERROR || VGZ_IbufEmpty(vef->vgz));
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 55e10ca..f2e5e91 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -202,7 +202,7 @@ vbf_stp_mkbereq(const struct worker *wrk, struct busyobj *bo)
 	bo->ws_bo = WS_Snapshot(bo->ws);
 	HTTP_Copy(bo->bereq, bo->bereq0);
 
-	VBO_setstate(bo->boc, BOS_REQ_DONE);
+	ObjSetState(bo->boc, BOS_REQ_DONE);
 	return (F_STP_STARTFETCH);
 }
 
@@ -648,7 +648,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
 
 	if (bo->do_stream) {
 		HSH_Unbusy(wrk, bo->fetch_objcore);
-		VBO_setstate(bo->boc, BOS_STREAM);
+		ObjSetState(bo->boc, BOS_STREAM);
 	}
 
 	VSLb(bo->vsl, SLT_Fetch_Body, "%u %s %s",
@@ -682,7 +682,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
 	   give predictable backend reuse behavior for varnishtest */
 	VDI_Finish(bo->wrk, bo);
 
-	VBO_setstate(bo->boc, BOS_FINISHED);
+	ObjSetState(bo->boc, BOS_FINISHED);
 	VSLb_ts_busyobj(bo, "BerespBody", W_TIM_real(wrk));
 	if (bo->stale_oc != NULL)
 		EXP_Rearm(bo->stale_oc, bo->stale_oc->exp.t_origin, 0, 0, 0);
@@ -736,7 +736,7 @@ vbf_stp_condfetch(struct worker *wrk, struct busyobj *bo)
 
 	if (bo->do_stream) {
 		HSH_Unbusy(wrk, bo->fetch_objcore);
-		VBO_setstate(bo->boc, BOS_STREAM);
+		ObjSetState(bo->boc, BOS_STREAM);
 	}
 
 	if (ObjIterate(wrk, bo->stale_oc, bo, vbf_objiterator))
@@ -758,7 +758,7 @@ vbf_stp_condfetch(struct worker *wrk, struct busyobj *bo)
 	   give predictable backend reuse behavior for varnishtest */
 	VDI_Finish(bo->wrk, bo);
 
-	VBO_setstate(bo->boc, BOS_FINISHED);
+	ObjSetState(bo->boc, BOS_FINISHED);
 	VSLb_ts_busyobj(bo, "BerespBody", W_TIM_real(wrk));
 	return (F_STP_DONE);
 }
@@ -858,7 +858,7 @@ vbf_stp_error(struct worker *wrk, struct busyobj *bo)
 	VSB_delete(synth_body);
 
 	HSH_Unbusy(wrk, bo->fetch_objcore);
-	VBO_setstate(bo->boc, BOS_FINISHED);
+	ObjSetState(bo->boc, BOS_FINISHED);
 	return (F_STP_DONE);
 }
 
@@ -881,7 +881,7 @@ vbf_stp_fail(struct worker *wrk, struct busyobj *bo)
 		    bo->fetch_objcore->exp.t_origin, 0, 0, 0);
 	}
 	wrk->stats->fetch_failed++;
-	VBO_setstate(bo->boc, BOS_FAILED);
+	ObjSetState(bo->boc, BOS_FAILED);
 	return (F_STP_DONE);
 }
 
@@ -1031,9 +1031,9 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
 	} else {
 		bo_fetch = NULL; /* ref transferred to fetch thread */
 		if (mode == VBF_BACKGROUND) {
-			VBO_waitstate(bo->boc, BOS_REQ_DONE);
+			ObjWaitState(bo->boc, BOS_REQ_DONE);
 		} else {
-			VBO_waitstate(bo->boc, BOS_STREAM);
+			ObjWaitState(bo->boc, BOS_STREAM);
 			if (bo->boc->state == BOS_FAILED) {
 				AN((oc->flags & OC_F_FAILED));
 			} else {
diff --git a/bin/varnishd/cache/cache_fetch_proc.c b/bin/varnishd/cache/cache_fetch_proc.c
index f404a35..f017f5d 100644
--- a/bin/varnishd/cache/cache_fetch_proc.c
+++ b/bin/varnishd/cache/cache_fetch_proc.c
@@ -98,7 +98,7 @@ VFP_Extend(const struct vfp_ctx *vc, ssize_t sz)
 {
 	CHECK_OBJ_NOTNULL(vc, VFP_CTX_MAGIC);
 
-	VBO_extend(vc->wrk, vc->oc, vc->bo->boc, sz);
+	ObjExtend(vc->wrk, vc->oc, vc->bo->boc, sz);
 }
 
 /**********************************************************************
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index 67faea0..d168044 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -107,15 +107,83 @@ ObjGetSpace(struct worker *wrk, struct objcore *oc, ssize_t *sz, uint8_t **ptr)
  */
 
 void
-ObjExtend(struct worker *wrk, struct objcore *oc, ssize_t l)
+ObjExtend(struct worker *wrk, struct objcore *oc, struct boc *boc, ssize_t l)
 {
 	const struct obj_methods *om = obj_getmethods(oc);
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	AN(om->objextend);
 	assert(l > 0);
 
-	AN(om->objextend);
-	om->objextend(wrk, oc, l);
+	if (boc != NULL) {
+		CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
+		Lck_Lock(&boc->mtx);
+		om->objextend(wrk, oc, l);
+		AZ(pthread_cond_broadcast(&boc->cond));
+		Lck_Unlock(&boc->mtx);
+	} else {
+		om->objextend(wrk, oc, l);
+	}
+}
+
+/*====================================================================
+ */
+
+ssize_t
+ObjWaitExtend(struct worker *wrk, struct objcore *oc, struct boc *boc,
+    ssize_t l)
+{
+	ssize_t rv;
+
+	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+	CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
+	Lck_Lock(&boc->mtx);
+	rv = ObjGetLen(wrk, oc);
+	while (1) {
+		assert(l <= rv || boc->state == BOS_FAILED);
+		if (rv > l || boc->state >= BOS_FINISHED)
+			break;
+		(void)Lck_CondWait(&boc->cond, &boc->mtx, 0);
+		rv = ObjGetLen(wrk, oc);
+	}
+	Lck_Unlock(&boc->mtx);
+	return (rv);
+}
+
+/*====================================================================
+ */
+
+void
+ObjSetState(struct boc *boc, enum busyobj_state_e next)
+{
+
+	CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
+
+	// assert(bo->do_stream || next != BOS_STREAM);
+	assert(next > boc->state);
+	Lck_Lock(&boc->mtx);
+	boc->state = next;
+	AZ(pthread_cond_broadcast(&boc->cond));
+	Lck_Unlock(&boc->mtx);
+}
+
+/*====================================================================
+ */
+
+void
+ObjWaitState(struct boc *boc, enum busyobj_state_e want)
+{
+
+	CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
+
+	Lck_Lock(&boc->mtx);
+	while (1) {
+		if (boc->state >= want)
+			break;
+		(void)Lck_CondWait(&boc->cond, &boc->mtx, 0);
+	}
+	Lck_Unlock(&boc->mtx);
 }
 
 /*====================================================================
diff --git a/bin/varnishd/cache/cache_req_body.c b/bin/varnishd/cache/cache_req_body.c
index 30089d1..1c05484 100644
--- a/bin/varnishd/cache/cache_req_body.c
+++ b/bin/varnishd/cache/cache_req_body.c
@@ -254,7 +254,7 @@ VRB_Cache(struct req *req, ssize_t maxsize)
 			req->acct.req_bodybytes += l;
 			if (yet >= l)
 				yet -= l;
-			ObjExtend(req->wrk, req->body_oc, l);
+			ObjExtend(req->wrk, req->body_oc, NULL, l);
 		}
 
 	} while (vfps == VFP_OK);
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 95ef52f..cccb046 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -202,7 +202,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
 		if (req->esi_level == 0 && bo->boc->state == BOS_FINISHED) {
 			VBO_DerefBusyObj(wrk, &bo);
 		} else if (!bo->do_stream) {
-			VBO_waitstate(bo->boc, BOS_FINISHED);
+			ObjWaitState(bo->boc, BOS_FINISHED);
 			VBO_DerefBusyObj(wrk, &bo);
 		}
 	}
@@ -216,7 +216,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
 
 	if (req->objcore->flags & (OC_F_PRIVATE | OC_F_PASS)) {
 		if (bo != NULL)
-			VBO_waitstate(bo->boc, BOS_FINISHED);
+			ObjWaitState(bo->boc, BOS_FINISHED);
 		ObjSlim(wrk, req->objcore);
 	}
 
@@ -296,7 +296,7 @@ cnt_synth(struct worker *wrk, struct req *req)
 		sz = szl;
 		if (ObjGetSpace(wrk, req->objcore, &sz, &ptr) && sz >= szl) {
 			memcpy(ptr, VSB_data(synth_body), szl);
-			ObjExtend(wrk, req->objcore, szl);
+			ObjExtend(wrk, req->objcore, NULL, szl);
 		} else
 			szl = -1;
 	}
diff --git a/bin/varnishd/storage/storage_simple.c b/bin/varnishd/storage/storage_simple.c
index a7d3236..f071930 100644
--- a/bin/varnishd/storage/storage_simple.c
+++ b/bin/varnishd/storage/storage_simple.c
@@ -257,7 +257,7 @@ sml_iterator(struct worker *wrk, struct objcore *oc,
 
 	while (1) {
 		ol = len;
-		nl = VBO_waitlen(wrk, oc, bo->boc, ol);
+		nl = ObjWaitExtend(wrk, oc, bo->boc, ol);
 		if (bo->boc->state == BOS_FAILED) {
 			ret = -1;
 			break;



More information about the varnish-commit mailing list