[experimental-ims] cf81441 Tag oc's with COMPLETE or FAILURE when we fetch the body.

Poul-Henning Kamp phk at FreeBSD.org
Thu Dec 18 10:27:41 CET 2014


commit cf81441e52a10143c5383472c9d25a073b6fde46
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Mar 12 22:19:48 2012 +0000

    Tag oc's with COMPLETE or FAILURE when we fetch the body.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 17f4f4d..08e3405 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -381,6 +381,8 @@ struct objcore {
 #define OC_F_LRUDONTMOVE	(1<<4)
 #define OC_F_PRIV		(1<<5)		/* Stevedore private flag */
 #define OC_F_LURK		(3<<6)		/* Ban-lurker-color */
+#define OC_F_COMPLETE		(1<<8)
+#define OC_F_FAILED		(1<<9)
 	unsigned		timer_idx;
 	VTAILQ_ENTRY(objcore)	list;
 	VTAILQ_ENTRY(objcore)	lru_list;
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index 1192f81..9f69bfa 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -921,9 +921,9 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
 	AN(req->director);
 
 	if (bo->state == BOS_FAILED) {
-		HSH_Drop(wrk, &sp->req->obj);
-		VBO_DerefBusyObj(wrk, &req->busyobj);
+		HSH_Drop(wrk, &req->obj);
 		AZ(req->obj);
+		VBO_DerefBusyObj(wrk, &req->busyobj);
 		req->err_code = 503;
 		sp->step = STP_ERROR;
 		return (0);
@@ -1145,6 +1145,9 @@ cnt_lookup(struct sess *sp, struct worker *wrk, struct req *req)
 		return (0);
 	}
 
+	/* For now... */
+	AN(oc->flags & (OC_F_COMPLETE|OC_F_FAILED));
+
 	o = oc_getobj(&wrk->stats, oc);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	req->obj = o;
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 172f422..feebd9b 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -634,6 +634,13 @@ FetchBody(struct worker *wrk, void *priv)
 	http_Teardown(bo->bereq);
 	http_Teardown(bo->beresp);
 
+	if (obj->objcore != NULL) {
+		/* pass has no objcore */
+		/* XXX: lock protection ?? */
+		obj->objcore->flags |=
+		    (bo->state == BOS_FAILED ? OC_F_FAILED : OC_F_COMPLETE);
+	}
+
 	if (bo->state == BOS_FAILED) {
 		wrk->stats.fetch_failed++;
 		VDI_CloseFd(&bo->vbc);
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 6a3af2f..514dbeb 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -269,6 +269,7 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc)
 	oc->refcnt = 1;
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AZ(oc->flags & OC_F_BUSY);
+	oc->flags |= OC_F_COMPLETE;
 
 	VTAILQ_INSERT_HEAD(&oh->objcs, oc, list);
 	/* NB: do not deref objhead the new object inherits our reference */



More information about the varnish-commit mailing list