r5551 - trunk/varnish-cache/bin/varnishd

phk at varnish-cache.org phk at varnish-cache.org
Wed Nov 17 14:06:27 CET 2010


Author: phk
Date: 2010-11-17 14:06:26 +0100 (Wed, 17 Nov 2010)
New Revision: 5551

Modified:
   trunk/varnish-cache/bin/varnishd/cache_ban.c
   trunk/varnish-cache/bin/varnishd/cache_center.c
   trunk/varnish-cache/bin/varnishd/cache_expire.c
   trunk/varnish-cache/bin/varnishd/cache_hash.c
   trunk/varnish-cache/bin/varnishd/hash_slinger.h
Log:
Rework/simplify the obj/objcore dereference logic.




Modified: trunk/varnish-cache/bin/varnishd/cache_ban.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_ban.c	2010-11-17 08:04:07 UTC (rev 5550)
+++ trunk/varnish-cache/bin/varnishd/cache_ban.c	2010-11-17 13:06:26 UTC (rev 5551)
@@ -534,7 +534,7 @@
 		o = oc_getobj(sp->wrk, oc);
 		i = ban_check_object(o, sp, 0);
 		WSP(sp, SLT_Debug, "lurker: %p %g %d", oc, o->ttl, i);
-		HSH_Deref(sp->wrk, &o);
+		(void)HSH_Deref(sp->wrk, NULL, &o);
 		TIM_sleep(params->ban_lurker_sleep);
 	}
 	NEEDLESS_RETURN(NULL);

Modified: trunk/varnish-cache/bin/varnishd/cache_center.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_center.c	2010-11-17 08:04:07 UTC (rev 5550)
+++ trunk/varnish-cache/bin/varnishd/cache_center.c	2010-11-17 13:06:26 UTC (rev 5551)
@@ -203,7 +203,7 @@
 
 	RES_WriteObj(sp);
 	AZ(sp->wrk->wfd);
-	HSH_Deref(sp->wrk, &sp->obj);
+	(void)HSH_Deref(sp->wrk, NULL, &sp->obj);
 	sp->wrk->resp = NULL;
 	sp->step = STP_DONE;
 	return (0);
@@ -471,7 +471,7 @@
 		if (sp->objcore != NULL) {
 			CHECK_OBJ_NOTNULL(sp->objhead, OBJHEAD_MAGIC);
 			CHECK_OBJ_NOTNULL(sp->objcore, OBJCORE_MAGIC);
-			HSH_DerefObjCore(sp->wrk, sp->objcore);
+			AZ(HSH_Deref(sp->wrk, sp->objcore, NULL));
 			sp->objhead = NULL;
 			sp->objcore = NULL;
 		}
@@ -532,7 +532,7 @@
 		sp->wrk->cacheable = 0;
 	} else if (!sp->wrk->cacheable) {
 		if (sp->objhead != NULL) {
-			HSH_DerefObjCore(sp->wrk, sp->objcore);
+			AZ(HSH_Deref(sp->wrk, sp->objcore, NULL));
 			sp->objhead = NULL;
 			sp->objcore = NULL;
 		}
@@ -751,7 +751,7 @@
 	}
 
 	/* Drop our object, we won't need it */
-	HSH_Deref(sp->wrk, &sp->obj);
+	(void)HSH_Deref(sp->wrk, NULL, &sp->obj);
 	sp->objcore = NULL;
 	AZ(sp->objhead);
 
@@ -844,7 +844,7 @@
 	if (oc->flags & OC_F_PASS) {
 		sp->wrk->stats.cache_hitpass++;
 		WSP(sp, SLT_HitPass, "%u", sp->obj->xid);
-		HSH_Deref(sp->wrk, &sp->obj);
+		(void)HSH_Deref(sp->wrk, NULL, &sp->obj);
 		sp->objcore = NULL;
 		sp->objhead = NULL;
 		sp->step = STP_PASS;
@@ -901,13 +901,13 @@
 	VCL_miss_method(sp);
 	switch(sp->handling) {
 	case VCL_RET_ERROR:
-		HSH_DerefObjCore(sp->wrk, sp->objcore);
+		AZ(HSH_Deref(sp->wrk, sp->objcore, NULL));
 		sp->objhead = NULL;
 		sp->objcore = NULL;
 		sp->step = STP_ERROR;
 		return (0);
 	case VCL_RET_PASS:
-		HSH_DerefObjCore(sp->wrk, sp->objcore);
+		AZ(HSH_Deref(sp->wrk, sp->objcore, NULL));
 		sp->objhead = NULL;
 		sp->objcore = NULL;
 		sp->step = STP_PASS;
@@ -916,7 +916,7 @@
 		sp->step = STP_FETCH;
 		return (0);
 	case VCL_RET_RESTART:
-		HSH_DerefObjCore(sp->wrk, sp->objcore);
+		AZ(HSH_Deref(sp->wrk, sp->objcore, NULL));
 		sp->objhead = NULL;
 		sp->objcore = NULL;
 		INCOMPL();

Modified: trunk/varnish-cache/bin/varnishd/cache_expire.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_expire.c	2010-11-17 08:04:07 UTC (rev 5550)
+++ trunk/varnish-cache/bin/varnishd/cache_expire.c	2010-11-17 13:06:26 UTC (rev 5551)
@@ -292,13 +292,13 @@
 			AN(o);
 			WSL(sp->wrk, SLT_ExpKill, 0, "%u %d",
 			    o->xid, (int)(o->ttl - t));
-			HSH_Deref(sp->wrk, &o);
+			(void)HSH_Deref(sp->wrk, NULL, &o);
 		} else {
 			WSL(sp->wrk, SLT_ExpKill, 1, "-1 %d",
 			    (int)(oc->timer_when - t));
 
 			oc->priv = NULL;
-			HSH_DerefObjCore(sp->wrk, oc);
+			AZ(HSH_Deref(sp->wrk, oc, NULL));
 			sp->wrk->stats.n_vampireobject--;
 		}
 	}
@@ -354,7 +354,7 @@
 
 	o = oc_getobj(sp->wrk, oc);
 	WSL(sp->wrk, SLT_ExpKill, 0, "%u LRU", o->xid);
-	HSH_Deref(sp->wrk, &o);
+	(void)HSH_Deref(sp->wrk, NULL, &o);
 	return (1);
 }
 

Modified: trunk/varnish-cache/bin/varnishd/cache_hash.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_hash.c	2010-11-17 08:04:07 UTC (rev 5550)
+++ trunk/varnish-cache/bin/varnishd/cache_hash.c	2010-11-17 13:06:26 UTC (rev 5551)
@@ -585,7 +585,7 @@
 		if (!isnan(grace))
 			o->grace = grace;
 		EXP_Rearm(o);
-		HSH_Deref(sp->wrk, &o);
+		(void)HSH_Deref(sp->wrk, NULL, &o);
 	}
 	WS_Release(sp->wrk->ws, 0);
 }
@@ -613,7 +613,7 @@
 	o->cacheable = 0;
 	if (o->objcore != NULL)		/* Pass has no objcore */
 		HSH_Unbusy(sp);
-	HSH_Deref(sp->wrk, &sp->obj);
+	(void)HSH_Deref(sp->wrk, NULL, &sp->obj);
 }
 
 void
@@ -662,28 +662,84 @@
 	Lck_Unlock(&oh->mtx);
 }
 
-void
-HSH_DerefObjCore(struct worker *wrk, struct objcore *oc)
+/*******************************************************************
+ * Dereference objcore and or object
+ *
+ * Can deal with:
+ *	bare objcore (incomplete fetch)
+ *	bare object (pass)
+ *	object with objcore
+ *	XXX later:  objcore with object (?)
+ *
+ * But you can only supply one of the two arguments at a time.
+ *
+ * Returns zero if target was destroyed.
+ */
+
+int
+HSH_Deref(struct worker *w, struct objcore *oc, struct object **oo)
 {
+	struct object *o;
 	struct objhead *oh;
+	unsigned r;
 
-	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
-	oh = oc->objhead;
-	CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
+	if (oc != NULL) {
+		AZ(oo);
+		o = NULL;
+		AZ(oc->priv);	// XXX: for now
+	} else {
+		AZ(oc);
+		AN(oo);
+		o = *oo;
+		*oo = NULL;
+		CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
+		oc = o->objcore;
+	}
 
-	AZ(oc->priv);
+	if (oc != NULL) {
+		CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+		oh = oc->objhead;
+		CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
 
-	Lck_Lock(&oh->mtx);
-	VTAILQ_REMOVE(&oh->objcs, oc, list);
-	if (oc->flags & OC_F_BUSY)
-		hsh_rush(oh);
-	Lck_Unlock(&oh->mtx);
-	oc->objhead = NULL;
-	assert(oh->refcnt > 0);
+		Lck_Lock(&oh->mtx);
+		assert(oh->refcnt > 0);
+		assert(oc->refcnt > 0);
+		r = --oc->refcnt;
+		if (!r)
+			VTAILQ_REMOVE(&oh->objcs, oc, list);
+		if (oc->flags & OC_F_BUSY)
+			hsh_rush(oh);
+		Lck_Unlock(&oh->mtx);
+		if (r != 0)
+			return (r);
+	}
+
+	if (o != NULL) {
+		if (oc != NULL)
+			BAN_DestroyObj(o);
+		AZ(o->ban);
+		DSL(0x40, SLT_Debug, 0, "Object %u workspace min free %u",
+		    o->xid, WS_Free(o->ws_o));
+
+		if (o->esidata != NULL)
+			ESI_Destroy(o);
+		if (oc != NULL)
+			oc_freeobj(oc);
+		w->stats.n_object--;
+	}
+
+	if (oc == NULL) 
+		return (0);
+
+	AN(oh);
 	FREE_OBJ(oc);
-	wrk->stats.n_objectcore--;
-	if (!hash->deref(oh))
-		HSH_DeleteObjHead(wrk, oh);
+	w->stats.n_objectcore--;
+	/* Drop our ref on the objhead */
+	assert(oh->refcnt > 0);
+	if (hash->deref(oh))
+		return (0);
+	HSH_DeleteObjHead(w, oh);
+	return (0);
 }
 
 /*******************************************************************
@@ -722,68 +778,7 @@
 	*oc = oc2;
 }
 
-void
-HSH_Deref(struct worker *w, struct object **oo)
-{
-	struct object *o;
-	struct objhead *oh;
-	struct objcore *oc;
-	unsigned r;
 
-	AN(oo);
-	o = *oo;
-	*oo = NULL;
-	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
-	oc = o->objcore;
-	if (oc == NULL) {
-		r = 0;
-		oh = NULL;
-	} else {
-		CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
-		oh = oc->objhead;
-		CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
-
-		Lck_Lock(&oh->mtx);
-		assert(oh->refcnt > 0);
-		assert(oc->refcnt > 0);
-		r = --oc->refcnt;
-		if (!r)
-			VTAILQ_REMOVE(&oh->objcs, oc, list);
-		hsh_rush(oh);
-		Lck_Unlock(&oh->mtx);
-	}
-
-	/* If still referenced, done */
-	if (r != 0)
-		return;
-
-	if (oh != NULL)
-		BAN_DestroyObj(o);
-	AZ(o->ban);
-	DSL(0x40, SLT_Debug, 0, "Object %u workspace min free %u",
-	    o->xid, WS_Free(o->ws_o));
-
-	if (o->esidata != NULL)
-		ESI_Destroy(o);
-	if (o->objcore != NULL)
-		oc_freeobj(o->objcore);
-	o = NULL;
-	w->stats.n_object--;
-
-	if (oc == NULL) {
-		AZ(oh);
-		return;
-	}
-	AN(oh);
-	FREE_OBJ(oc);
-	w->stats.n_objectcore--;
-	/* Drop our ref on the objhead */
-	assert(oh->refcnt > 0);
-	if (hash->deref(oh))
-		return;
-	HSH_DeleteObjHead(w, oh);
-}
-
 void
 HSH_Init(void)
 {

Modified: trunk/varnish-cache/bin/varnishd/hash_slinger.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/hash_slinger.h	2010-11-17 08:04:07 UTC (rev 5550)
+++ trunk/varnish-cache/bin/varnishd/hash_slinger.h	2010-11-17 13:06:26 UTC (rev 5551)
@@ -61,7 +61,6 @@
 double HSH_Grace(double g);
 void HSH_Init(void);
 void HSH_AddString(const struct sess *sp, const char *str);
-void HSH_DerefObjCore(struct worker *sp, struct objcore *oc);
 void HSH_FindBan(const struct sess *sp, struct objcore **oc);
 struct objcore *HSH_Insert(const struct sess *sp);
 void HSH_Purge(const struct sess *, struct objhead *, double ttl, double grace);
@@ -94,7 +93,7 @@
 };
 
 void HSH_DeleteObjHead(struct worker *w, struct objhead *oh);
-void HSH_Deref(struct worker *w, struct object **o);
+int HSH_Deref(struct worker *w, struct objcore *oc, struct object **o);
 #endif /* VARNISH_CACHE_CHILD */
 
 extern const struct hash_slinger hsl_slinger;




More information about the varnish-commit mailing list