[master] e6aaefc Allocate the boc with the objcore. Dispose when refcount goes to zero. Private objcores for pipe neither want nor need a boc, so make it optional.

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


commit e6aaefc5928d2c2ab96fda5a074e9b5b2bd6326d
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Jan 21 00:21:19 2016 +0000

    Allocate the boc with the objcore.
    Dispose when refcount goes to zero.
    Private objcores for pipe neither want nor need a boc, so make it optional.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 2de7093..b080036 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -463,7 +463,7 @@ struct busyobj {
 	unsigned		magic;
 #define BUSYOBJ_MAGIC		0x23b95567
 
-	struct boc		boc[1];
+	struct boc		*boc;
 
 	char			*end;
 
diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
index 809138e..110c44f 100644
--- a/bin/varnishd/cache/cache_busyobj.c
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -68,11 +68,6 @@ vbo_New(void)
 	XXXAN(bo);
 	bo->magic = BUSYOBJ_MAGIC;
 	bo->end = (char *)bo + sz;
-	INIT_OBJ(bo->boc, BOC_MAGIC);
-	Lck_New(&bo->boc->mtx, lck_busyobj);
-	AZ(pthread_cond_init(&bo->boc->cond, NULL));
-	bo->boc->busyobj = bo;
-	bo->boc->refcount = 1;
 	return (bo);
 }
 
@@ -86,9 +81,6 @@ vbo_Free(struct busyobj **bop)
 	*bop = NULL;
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	AZ(bo->htc);
-	AZ(bo->boc->refcount);
-	AZ(pthread_cond_destroy(&bo->boc->cond));
-	Lck_Delete(&bo->boc->mtx);
 	MPL_Free(vbopool, bo);
 }
 
@@ -192,14 +184,6 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
 
 	VCL_Rel(&bo->vcl);
 
-	AZ(bo->boc->stevedore_priv);
-	AZ(bo->boc->refcount);
-	bo->boc->state = BOS_INVALID;
-	if (bo->boc->vary != NULL) {
-		free(bo->boc->vary);
-		bo->boc->vary = NULL;
-	}
-
 	memset(&bo->retries, 0,
 	    sizeof *bo - offsetof(struct busyobj, retries));
 
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index e7dc558..6c353b6 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -985,7 +985,8 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
 	}
 
 	bo = VBO_GetBusyObj(wrk, req);
-	oc->boc = bo->boc;
+	bo->boc = oc->boc;
+	bo->boc->busyobj = bo;
 
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	VSLb(bo->vsl, SLT_Begin, "bereq %u %s", VXID(req->vsl->wid), how);
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index ddd8279..96f1f7a 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -68,14 +68,21 @@ static struct objhead *private_oh;
 /*---------------------------------------------------------------------*/
 
 static struct objcore *
-hsh_NewObjCore(struct worker *wrk)
+hsh_NewObjCore(struct worker *wrk, int boc)
 {
 	struct objcore *oc;
 
 	ALLOC_OBJ(oc, OBJCORE_MAGIC);
-	XXXAN(oc);
+	AN(oc);
 	wrk->stats->n_objectcore++;
 	oc->flags |= OC_F_BUSY | OC_F_INCOMPLETE;
+	if (boc) {
+		ALLOC_OBJ(oc->boc, BOC_MAGIC);
+		AN(oc->boc);
+		Lck_New(&oc->boc->mtx, lck_busyobj);
+		AZ(pthread_cond_init(&oc->boc->cond, NULL));
+		oc->boc->refcount = 1;
+	}
 	return (oc);
 }
 
@@ -104,7 +111,7 @@ hsh_prealloc(struct worker *wrk)
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 
 	if (wrk->nobjcore == NULL)
-		wrk->nobjcore = hsh_NewObjCore(wrk);
+		wrk->nobjcore = hsh_NewObjCore(wrk, 1);
 	CHECK_OBJ_NOTNULL(wrk->nobjcore, OBJCORE_MAGIC);
 
 	if (wrk->nobjhead == NULL) {
@@ -120,13 +127,13 @@ hsh_prealloc(struct worker *wrk)
 /*---------------------------------------------------------------------*/
 
 struct objcore *
-HSH_Private(struct worker *wrk)
+HSH_Private(struct worker *wrk, int wantboc)
 {
 	struct objcore *oc;
 
 	CHECK_OBJ_NOTNULL(private_oh, OBJHEAD_MAGIC);
 
-	oc = hsh_NewObjCore(wrk);
+	oc = hsh_NewObjCore(wrk, wantboc);
 	AN(oc);
 	oc->refcnt = 1;
 	oc->objhead = private_oh;
@@ -717,7 +724,7 @@ HSH_RefBusy(const struct objcore *oc)
 	boc = oc->boc;
 	CHECK_OBJ_ORNULL(boc, BOC_MAGIC);
 	if (boc != NULL) {
-		CHECK_OBJ_NOTNULL(boc->busyobj, BUSYOBJ_MAGIC);
+		//CHECK_OBJ_NOTNULL(boc->busyobj, BUSYOBJ_MAGIC);
 		boc->refcount++;
 	}
 	Lck_Unlock(&oh->mtx);
@@ -741,8 +748,13 @@ HSH_DerefBusy(struct worker *wrk, struct objcore *oc)
 	if (r == 0)
 		oc->boc = NULL;
 	Lck_Unlock(&oc->objhead->mtx);
-	if (r == 0)
+	if (r == 0) {
 		VBO_DerefBusyObj(wrk, &boc->busyobj);
+		AZ(pthread_cond_destroy(&boc->cond));
+		Lck_Delete(&boc->mtx);
+		free(boc->vary);
+		FREE_OBJ(boc);
+	}
 }
 
 /*--------------------------------------------------------------------
diff --git a/bin/varnishd/cache/cache_req_body.c b/bin/varnishd/cache/cache_req_body.c
index bc7d270..dbdf15d 100644
--- a/bin/varnishd/cache/cache_req_body.c
+++ b/bin/varnishd/cache/cache_req_body.c
@@ -216,7 +216,7 @@ VRB_Cache(struct req *req, ssize_t maxsize)
 		return (-1);
 	}
 
-	req->body_oc = HSH_Private(req->wrk);
+	req->body_oc = HSH_Private(req->wrk, 0);
 	AN(req->body_oc);
 	XXXAN(STV_NewObject(req->wrk, req->body_oc, TRANSIENT_STORAGE, 8));
 
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 4bb06d8..365c482 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -293,7 +293,8 @@ cnt_synth(struct worker *wrk, struct req *req)
 	if (http_HdrIs(req->resp, H_Connection, "close"))
 		req->doclose = SC_RESP_CLOSE;
 
-	req->objcore = HSH_Private(wrk);
+	req->objcore = HSH_Private(wrk, 0);
+	AZ(req->objcore->boc);
 	CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
 	if (STV_NewObject(wrk, req->objcore, TRANSIENT_STORAGE, 1024)) {
 		szl = VSB_len(synth_body);
@@ -311,8 +312,9 @@ cnt_synth(struct worker *wrk, struct req *req)
 	if (szl < 0) {
 		VSLb(req->vsl, SLT_Error, "Could not get storage");
 		req->doclose = SC_OVERLOAD;
-	} else
+	} else {
 		cnt_vdp(req, NULL);
+	}
 
 	(void)HSH_DerefObjCore(wrk, &req->objcore);
 	VSB_delete(synth_body);
@@ -437,7 +439,7 @@ cnt_lookup(struct worker *wrk, struct req *req)
 	case VCL_RET_DELIVER:
 		if (busy != NULL) {
 			AZ(oc->flags & OC_F_PASS);
-			AZ(busy->boc);
+			CHECK_OBJ_NOTNULL(busy->boc, BOC_MAGIC);
 			VBF_Fetch(wrk, req, busy, oc, VBF_BACKGROUND);
 		} else {
 			(void)VRB_Ignore(req);// XXX: handle err
@@ -557,7 +559,7 @@ cnt_pass(struct worker *wrk, struct req *req)
 		break;
 	case VCL_RET_FETCH:
 		wrk->stats->s_pass++;
-		req->objcore = HSH_Private(wrk);
+		req->objcore = HSH_Private(wrk, 1);
 		CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
 		VBF_Fetch(wrk, req, req->objcore, NULL, VBF_PASS);
 		req->req_step = R_STP_FETCH;
@@ -602,7 +604,6 @@ 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 384b5af..7001204 100644
--- a/bin/varnishd/hash/hash_slinger.h
+++ b/bin/varnishd/hash/hash_slinger.h
@@ -74,7 +74,7 @@ void HSH_Purge(struct worker *, struct objhead *, double ttl, double grace,
 void HSH_config(const char *h_arg);
 struct boc *HSH_RefBusy(const struct objcore *);
 void HSH_DerefBusy(struct worker *wrk, struct objcore *);
-struct objcore *HSH_Private(struct worker *wrk);
+struct objcore *HSH_Private(struct worker *wrk, int wantboc);
 
 #ifdef VARNISH_CACHE_CHILD
 



More information about the varnish-commit mailing list