[master] 5b339ac Leave bo->fetch_objcore intact, even as the refcount moves to the object.

Poul-Henning Kamp phk at varnish-cache.org
Tue Sep 3 11:29:15 CEST 2013


commit 5b339acd19a25bd453f5d9858c26ed0c4f5ac286
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Sep 3 09:28:53 2013 +0000

    Leave bo->fetch_objcore intact, even as the refcount moves to the object.

diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
index 0920b7e..4b6c37f 100644
--- a/bin/varnishd/cache/cache_busyobj.c
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -159,7 +159,7 @@ void
 VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
 {
 	struct busyobj *bo;
-	struct objcore *oc;
+	struct objcore *oc = NULL;
 	unsigned r;
 
 	CHECK_OBJ_ORNULL(wrk, WORKER_MAGIC);
@@ -167,9 +167,10 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
 	bo = *pbo;
 	*pbo = NULL;
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+	CHECK_OBJ_ORNULL(bo->fetch_objcore, OBJCORE_MAGIC);
 	CHECK_OBJ_ORNULL(bo->fetch_obj, OBJECT_MAGIC);
-	if (bo->fetch_obj != NULL) {
-		oc = bo->fetch_obj->objcore;
+	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);
@@ -177,7 +178,6 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
 		r = --bo->refcount;
 		Lck_Unlock(&oc->objhead->mtx);
 	} else {
-		oc = NULL;
 		Lck_Lock(&bo->mtx);
 		assert(bo->refcount > 0);
 		r = --bo->refcount;
@@ -190,9 +190,9 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
 	VSLb(bo->vsl, SLT_End, "%s", "");
 	VSL_Flush(bo->vsl, 0);
 
-	if (oc != NULL) {
+	if (bo->fetch_objcore != NULL) {
 		AN(wrk);
-		(void)HSH_Deref(&wrk->stats, NULL, &bo->fetch_obj);
+		(void)HSH_Deref(&wrk->stats, bo->fetch_objcore, NULL);
 	}
 
 	VCL_Rel(&bo->vcl);
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 441ce2a..1f8ec3d 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -345,6 +345,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
 
 	AZ(bo->stats);
 	bo->stats = &wrk->stats;
+	AN(bo->fetch_objcore);
 	obj = STV_NewObject(bo, bo->storage_hint, l, nhttp);
 	if (obj == NULL) {
 		/*
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index d66c3de..442d7db 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -162,6 +162,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 	CHECK_OBJ_NOTNULL(req->obj->objcore, OBJCORE_MAGIC);
+	CHECK_OBJ_NOTNULL(req->obj->objcore->objhead, OBJHEAD_MAGIC);
 	CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
 
 	assert(req->obj->objcore->refcnt > 0);
@@ -288,9 +289,10 @@ cnt_error(struct worker *wrk, struct req *req)
 	AZ(bo->stats);
 	bo->stats = &wrk->stats;
 	bo->fetch_objcore = HSH_Private(wrk);
-	req->obj = STV_NewObject(bo,
+	bo->fetch_obj = STV_NewObject(bo,
 	    TRANSIENT_STORAGE, cache_param->http_resp_size,
 	    (uint16_t)cache_param->http_max_hdr);
+	req->obj = bo->fetch_obj;
 	bo->stats = NULL;
 	if (req->obj == NULL) {
 		req->doclose = SC_OVERLOAD;
@@ -305,7 +307,6 @@ cnt_error(struct worker *wrk, struct req *req)
 	}
 	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 	AZ(req->objcore);
-	AZ(bo->fetch_objcore);
 	req->obj->vxid = bo->vsl->wid;
 	req->obj->exp.entered = req->t_req;
 
@@ -320,6 +321,9 @@ cnt_error(struct worker *wrk, struct req *req)
 	http_PrintfHeader(h, "Date: %s", date);
 	http_SetHeader(h, "Server: Varnish");
 
+	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
+	HSH_Ref(req->obj->objcore);
+
 	if (req->err_reason != NULL)
 		http_PutResponse(h, req->err_reason);
 	else
@@ -331,11 +335,12 @@ cnt_error(struct worker *wrk, struct req *req)
 		wrk->handling = VCL_RET_DELIVER;
 
 	if (wrk->handling == VCL_RET_RESTART) {
-		HSH_Drop(wrk, &req->obj);
 		VBO_DerefBusyObj(wrk, &req->busyobj);
+		HSH_Drop(wrk, &req->obj);
 		req->req_step = R_STP_RESTART;
 		return (REQ_FSM_MORE);
 	}
+	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 
 	/* We always close when we take this path */
 	req->doclose = SC_TX_ERROR;
@@ -345,8 +350,10 @@ cnt_error(struct worker *wrk, struct req *req)
 	req->err_code = 0;
 	req->err_reason = NULL;
 	http_Teardown(bo->bereq);
+	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 	VBO_DerefBusyObj(wrk, &req->busyobj);
 	req->req_step = R_STP_DELIVER;
+	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 	return (REQ_FSM_MORE);
 }
 
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index af14533..5b36c08 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -288,7 +288,6 @@ STV_MkObject(struct stevedore *stv, struct busyobj *bo,
 	bo->stats->n_object++;
 
 	o->objcore = bo->fetch_objcore;
-	bo->fetch_objcore = NULL;     /* refcnt follows pointer. */
 	if (!(o->objcore->flags & OC_F_PRIVATE))
 		BAN_NewObjCore(o->objcore);
 



More information about the varnish-commit mailing list