r1278 - trunk/varnish-cache/bin/varnishd
phk at projects.linpro.no
phk at projects.linpro.no
Wed Mar 7 11:38:20 CET 2007
Author: phk
Date: 2007-03-07 11:38:20 +0100 (Wed, 07 Mar 2007)
New Revision: 1278
Modified:
trunk/varnish-cache/bin/varnishd/cache.h
trunk/varnish-cache/bin/varnishd/cache_center.c
trunk/varnish-cache/bin/varnishd/cache_hash.c
Log:
Add a bit of garbage collection to yesterdays change: Passed objects need
to have their storage properly reclaimed, including the actual content
of a obj.pass=1 cache entry, once we have sent the content to the original
requestor.
Modified: trunk/varnish-cache/bin/varnishd/cache.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache.h 2007-03-06 22:40:06 UTC (rev 1277)
+++ trunk/varnish-cache/bin/varnishd/cache.h 2007-03-07 10:38:20 UTC (rev 1278)
@@ -351,6 +351,7 @@
/* cache_hash.c */
void HSH_Prealloc(struct sess *sp);
+void HSH_Freestore(struct object *o);
struct object *HSH_Lookup(struct sess *sp);
void HSH_Unbusy(struct object *o);
void HSH_Ref(struct object *o);
Modified: trunk/varnish-cache/bin/varnishd/cache_center.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_center.c 2007-03-06 22:40:06 UTC (rev 1277)
+++ trunk/varnish-cache/bin/varnishd/cache_center.c 2007-03-07 10:38:20 UTC (rev 1278)
@@ -136,6 +136,10 @@
{
RES_WriteObj(sp);
+ if (sp->obj->objhead != NULL && sp->obj->pass) {
+ /* we will no longer need the storage */
+ HSH_Freestore(sp->obj);
+ }
HSH_Deref(sp->obj);
sp->obj = NULL;
sp->step = STP_DONE;
@@ -300,9 +304,10 @@
sp->obj->pass = 1;
sp->obj->cacheable = 1;
- HSH_Ref(sp->obj); /* get another, STP_DELIVER will deref */
- if (sp->obj->objhead != NULL)
+ if (sp->obj->objhead != NULL) {
+ HSH_Ref(sp->obj); /* get another, STP_DELIVER will deref */
HSH_Unbusy(sp->obj);
+ }
sp->wrk->acct.fetch++;
sp->step = STP_DELIVER;
return (0);
Modified: trunk/varnish-cache/bin/varnishd/cache_hash.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_hash.c 2007-03-06 22:40:06 UTC (rev 1277)
+++ trunk/varnish-cache/bin/varnishd/cache_hash.c 2007-03-07 10:38:20 UTC (rev 1278)
@@ -96,6 +96,18 @@
CHECK_OBJ_NOTNULL(w->nobj, OBJECT_MAGIC);
}
+void
+HSH_Freestore(struct object *o)
+{
+ struct storage *st, *stn;
+
+ TAILQ_FOREACH_SAFE(st, &o->store, list, stn) {
+ CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
+ TAILQ_REMOVE(&o->store, st, list);
+ st->stevedore->free(st);
+ }
+}
+
struct object *
HSH_Lookup(struct sess *sp)
{
@@ -213,43 +225,37 @@
HSH_Deref(struct object *o)
{
struct objhead *oh;
- struct storage *st, *stn;
unsigned r;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
oh = o->objhead;
- if (oh == NULL) {
- /* Pass object, not referenced anywhere */
- free(o);
- return;
+ if (oh != NULL) {
+ CHECK_OBJ(oh, OBJHEAD_MAGIC);
+
+ /* drop ref on object */
+ LOCK(&oh->mtx);
}
-
- CHECK_OBJ(oh, OBJHEAD_MAGIC);
-
- /* drop ref on object */
- LOCK(&oh->mtx);
assert(o->refcnt > 0);
r = --o->refcnt;
- if (!r)
- TAILQ_REMOVE(&oh->objects, o, list);
- UNLOCK(&oh->mtx);
+ if (oh != NULL) {
+ if (!r)
+ TAILQ_REMOVE(&oh->objects, o, list);
+ UNLOCK(&oh->mtx);
+ }
/* If still referenced, done */
if (r != 0)
return;
- if (o->http.s != NULL) {
+ if (o->http.s != NULL)
free(o->http.s);
- }
- TAILQ_FOREACH_SAFE(st, &o->store, list, stn) {
- CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
- TAILQ_REMOVE(&o->store, st, list);
- st->stevedore->free(st);
- }
+ HSH_Freestore(o);
free(o);
VSL_stats->n_object--;
+ if (oh == NULL)
+ return;
/* Drop our ref on the objhead */
if (hash->deref(oh))
return;
More information about the varnish-commit
mailing list