From: phk Date: Sat, 28 Feb 2009 19:00:00 +0000 (+0000) Subject: When we know that an object will not make it into the hash X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb438bcb968bfb70e9b47441b4ae41fd06792742;p=varnish When we know that an object will not make it into the hash table permanently, use malloc(3) as backing store. This affects mainly pass'ed requests. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@3843 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- diff --git a/varnish-cache/bin/varnishd/cache_center.c b/varnish-cache/bin/varnishd/cache_center.c index b5ebbb48..27ed5923 100644 --- a/varnish-cache/bin/varnishd/cache_center.c +++ b/varnish-cache/bin/varnishd/cache_center.c @@ -314,7 +314,7 @@ cnt_error(struct sess *sp) w = sp->wrk; if (sp->obj == NULL) { HSH_Prealloc(sp); - sp->obj = HSH_NewObject(sp); + sp->obj = HSH_NewObject(sp, 1); sp->obj->xid = sp->xid; sp->obj->entered = sp->t_req; } else { @@ -682,7 +682,7 @@ cnt_lookup(struct sess *sp) VSL_stats->cache_miss++; AZ(oc->obj); - o = HSH_NewObject(sp); + o = HSH_NewObject(sp, 0); o->objhead = oh; o->objcore = oc; @@ -819,7 +819,7 @@ cnt_pass(struct sess *sp) assert(sp->handling == VCL_RET_PASS); sp->acct_req.pass++; HSH_Prealloc(sp); - sp->obj = HSH_NewObject(sp); + sp->obj = HSH_NewObject(sp, 1); sp->sendbody = 1; sp->step = STP_FETCH; return (0); diff --git a/varnish-cache/bin/varnishd/cache_hash.c b/varnish-cache/bin/varnishd/cache_hash.c index fc1d3629..f891eb64 100644 --- a/varnish-cache/bin/varnishd/cache_hash.c +++ b/varnish-cache/bin/varnishd/cache_hash.c @@ -80,24 +80,35 @@ HSH_Grace(double g) } struct object * -HSH_NewObject(struct sess *sp) +HSH_NewObject(struct sess *sp, int transient) { struct object *o; struct storage *st; - - st = STV_alloc(sp, params->obj_workspace); - XXXAN(st); - assert(st->space > sizeof *o); - o = (void *)st->ptr; /* XXX: align ? */ - st->len = sizeof *o; - memset(o, 0, sizeof *o); - o->objstore = st; - WS_Init(o->ws_o, "obj", - st->ptr + st->len, st->space - st->len); - st->len = st->space; + void *p; + + if (transient) { + p = malloc(sizeof *o + params->obj_workspace); + XXXAN(p); + o = p; + p = o + 1; + memset(o, 0, sizeof *o); + o->magic = OBJECT_MAGIC; + WS_Init(o->ws_o, "obj", p, params->obj_workspace); + } else { + st = STV_alloc(sp, params->obj_workspace); + XXXAN(st); + assert(st->space > sizeof *o); + o = (void *)st->ptr; /* XXX: align ? */ + st->len = sizeof *o; + memset(o, 0, sizeof *o); + o->magic = OBJECT_MAGIC; + o->objstore = st; + WS_Init(o->ws_o, "obj", + st->ptr + st->len, st->space - st->len); + st->len = st->space; + } WS_Assert(o->ws_o); http_Setup(o->http, o->ws_o); - o->magic = OBJECT_MAGIC; o->http->magic = HTTP_MAGIC; o->refcnt = 1; o->grace = NAN; @@ -510,7 +521,10 @@ HSH_Deref(const struct worker *w, struct object **oo) ESI_Destroy(o); HSH_Freestore(o); - STV_free(o->objstore); + if (o->objstore != NULL) + STV_free(o->objstore); + else + FREE_OBJ(o); w->stats->n_object--; if (oh == NULL) { diff --git a/varnish-cache/bin/varnishd/hash_slinger.h b/varnish-cache/bin/varnishd/hash_slinger.h index e8634570..9b834f19 100644 --- a/varnish-cache/bin/varnishd/hash_slinger.h +++ b/varnish-cache/bin/varnishd/hash_slinger.h @@ -50,7 +50,7 @@ struct hash_slinger { }; /* cache_hash.c */ -struct object *HSH_NewObject(struct sess *sp); +struct object *HSH_NewObject(struct sess *sp, int transient); void HSH_Prealloc(const struct sess *sp); void HSH_Cleanup(struct worker *w); void HSH_Freestore(struct object *o);