r3750 - trunk/varnish-cache/bin/varnishd
phk at projects.linpro.no
phk at projects.linpro.no
Wed Feb 11 12:24:12 CET 2009
Author: phk
Date: 2009-02-11 12:24:12 +0100 (Wed, 11 Feb 2009)
New Revision: 3750
Modified:
trunk/varnish-cache/bin/varnishd/cache.h
trunk/varnish-cache/bin/varnishd/cache_cli.c
trunk/varnish-cache/bin/varnishd/cache_expire.c
Log:
Pull struct objexp out of the closet and call it objcore.
In the future, this will be the bits of a cached object we cannot
realistically expect to stay paged out for any period of time.
Modified: trunk/varnish-cache/bin/varnishd/cache.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache.h 2009-02-11 10:46:47 UTC (rev 3749)
+++ trunk/varnish-cache/bin/varnishd/cache.h 2009-02-11 11:24:12 UTC (rev 3750)
@@ -85,7 +85,7 @@
struct director;
struct object;
struct objhead;
-struct objexp;
+struct objcore;
struct workreq;
struct addrinfo;
struct esi_bit;
@@ -248,6 +248,26 @@
off_t where;
};
+/* Object core structure ---------------------------------------------
+ * Objects have sideways references in the binary heap and the LRU list
+ * and we want to avoid paging in a lot of objects just to move them up
+ * or down the binheap or to move a unrelated object on the LRU list.
+ * To avoid this we use a proxy object, objcore, to hold the relevant
+ * housekeeping fields parts of an object.
+ */
+
+struct objcore {
+ unsigned magic;
+#define OBJCORE_MAGIC 0x4d301302
+ struct object *obj;
+ double timer_when;
+ const char *timer_what;
+ unsigned timer_idx;
+ VTAILQ_ENTRY(objcore) list;
+ int on_lru;
+ double lru_stamp;
+};
+
/* Object structure --------------------------------------------------*/
struct object {
@@ -257,7 +277,7 @@
unsigned xid;
struct objhead *objhead;
struct storage *objstore;
- struct objexp *objexp;
+ struct objcore *objcore;
struct ws ws_o[1];
unsigned char *vary;
Modified: trunk/varnish-cache/bin/varnishd/cache_cli.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_cli.c 2009-02-11 10:46:47 UTC (rev 3749)
+++ trunk/varnish-cache/bin/varnishd/cache_cli.c 2009-02-11 11:24:12 UTC (rev 3750)
@@ -192,6 +192,7 @@
SZOF(struct bereq);
SZOF(struct storage);
SZOF(struct object);
+ SZOF(struct objcore);
SZOF(struct objhead);
SZOF(struct sess);
SZOF(struct vbe_conn);
Modified: trunk/varnish-cache/bin/varnishd/cache_expire.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_expire.c 2009-02-11 10:46:47 UTC (rev 3749)
+++ trunk/varnish-cache/bin/varnishd/cache_expire.c 2009-02-11 11:24:12 UTC (rev 3750)
@@ -63,33 +63,13 @@
#include "vcl.h"
#include "hash_slinger.h"
-/*
- * Objects have sideways references in the binary heap and the LRU list
- * and we want to avoid paging in a lot of objects just to move them up
- * or down the binheap or to move a unrelated object on the LRU list.
- * To avoid this we use a proxy object, objexp, to hold the relevant
- * housekeeping fields parts of an object.
- */
-
static const char * const tmr_prefetch = "prefetch";
static const char * const tmr_ttl = "ttl";
-struct objexp {
- unsigned magic;
-#define OBJEXP_MAGIC 0x4d301302
- struct object *obj;
- double timer_when;
- const char *timer_what;
- unsigned timer_idx;
- VTAILQ_ENTRY(objexp) list;
- int on_lru;
- double lru_stamp;
-};
-
static pthread_t exp_thread;
static struct binheap *exp_heap;
static struct lock exp_mtx;
-static VTAILQ_HEAD(,objexp) lru = VTAILQ_HEAD_INITIALIZER(lru);
+static VTAILQ_HEAD(,objcore) lru = VTAILQ_HEAD_INITIALIZER(lru);
/*
* This is a magic marker for the objects currently on the SIOP [look it up]
@@ -99,34 +79,34 @@
#define BINHEAP_NOIDX 0
/*--------------------------------------------------------------------
- * Add and Remove objexp's from objects.
+ * Add and Remove objcore's from objects.
*/
static void
-add_objexp(struct object *o)
+add_objcore(struct object *o)
{
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
- AZ(o->objexp);
+ AZ(o->objcore);
assert(o->busy);
assert(o->cacheable);
- o->objexp = calloc(sizeof *o->objexp, 1);
- AN(o->objexp);
- o->objexp->magic = OBJEXP_MAGIC;
- o->objexp->obj = o;
+ o->objcore = calloc(sizeof *o->objcore, 1);
+ AN(o->objcore);
+ o->objcore->magic = OBJCORE_MAGIC;
+ o->objcore->obj = o;
}
static void
-del_objexp(struct object *o)
+del_objcore(struct object *o)
{
- struct objexp *oe;
+ struct objcore *oc;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
- oe = o->objexp;
- o->objexp = NULL;
- CHECK_OBJ_NOTNULL(oe, OBJEXP_MAGIC);
- assert(oe->timer_idx == BINHEAP_NOIDX);
- free(oe);
+ oc = o->objcore;
+ o->objcore = NULL;
+ CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+ assert(oc->timer_idx == BINHEAP_NOIDX);
+ free(oc);
}
/*--------------------------------------------------------------------
@@ -136,13 +116,13 @@
static int
update_object_when(const struct object *o)
{
- struct objexp *oe;
+ struct objcore *oc;
double when;
const char *what;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
- oe = o->objexp;
- CHECK_OBJ_NOTNULL(oe, OBJEXP_MAGIC);
+ oc = o->objcore;
+ CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
Lck_AssertHeld(&exp_mtx);
if (o->prefetch < 0.0) {
@@ -157,10 +137,10 @@
what = tmr_ttl;
}
assert(!isnan(when));
- oe->timer_what = what;
- if (when == oe->timer_when)
+ oc->timer_what = what;
+ if (when == oc->timer_when)
return (0);
- oe->timer_when = when;
+ oc->timer_when = when;
return (1);
}
@@ -174,24 +154,24 @@
void
EXP_Insert(struct object *o)
{
- struct objexp *oe;
+ struct objcore *oc;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
assert(o->busy);
assert(o->cacheable);
HSH_Ref(o);
- add_objexp(o);
- oe = o->objexp;
+ add_objcore(o);
+ oc = o->objcore;
assert(o->entered != 0 && !isnan(o->entered));
- oe->lru_stamp = o->entered;
+ oc->lru_stamp = o->entered;
Lck_Lock(&exp_mtx);
- assert(oe->timer_idx == BINHEAP_NOIDX);
+ assert(oc->timer_idx == BINHEAP_NOIDX);
(void)update_object_when(o);
- binheap_insert(exp_heap, oe);
- assert(oe->timer_idx != BINHEAP_NOIDX);
- VTAILQ_INSERT_TAIL(&lru, oe, list);
- oe->on_lru = 1;
+ binheap_insert(exp_heap, oc);
+ assert(oc->timer_idx != BINHEAP_NOIDX);
+ VTAILQ_INSERT_TAIL(&lru, oc, list);
+ oc->on_lru = 1;
Lck_Unlock(&exp_mtx);
}
@@ -207,21 +187,21 @@
void
EXP_Touch(const struct object *o, double now)
{
- struct objexp *oe;
+ struct objcore *oc;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
- oe = o->objexp;
- if (oe == NULL)
+ oc = o->objcore;
+ if (oc == NULL)
return;
- CHECK_OBJ_NOTNULL(oe, OBJEXP_MAGIC);
- if (oe->lru_stamp + params->lru_timeout > now)
+ CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+ if (oc->lru_stamp + params->lru_timeout > now)
return;
if (Lck_Trylock(&exp_mtx))
return;
- if (oe->on_lru) {
- VTAILQ_REMOVE(&lru, oe, list);
- VTAILQ_INSERT_TAIL(&lru, oe, list);
- oe->lru_stamp = now;
+ if (oc->on_lru) {
+ VTAILQ_REMOVE(&lru, oc, list);
+ VTAILQ_INSERT_TAIL(&lru, oc, list);
+ oc->lru_stamp = now;
VSL_stats->n_lru_moved++;
}
Lck_Unlock(&exp_mtx);
@@ -239,30 +219,30 @@
void
EXP_Rearm(const struct object *o)
{
- struct objexp *oe;
+ struct objcore *oc;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
- oe = o->objexp;
- if (oe == NULL)
+ oc = o->objcore;
+ if (oc == NULL)
return;
- CHECK_OBJ_NOTNULL(oe, OBJEXP_MAGIC);
+ CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
Lck_Lock(&exp_mtx);
/*
* The hang-man might have this object of the binheap while
* tending to a timer. If so, we do not muck with it here.
*/
- if (oe->timer_idx != BINHEAP_NOIDX && update_object_when(o)) {
+ if (oc->timer_idx != BINHEAP_NOIDX && update_object_when(o)) {
/*
* XXX: this could possibly be optimized by shuffling
* XXX: up or down, but that leaves some very nasty
* XXX: corner cases, such as shuffling all the way
* XXX: down the left half, then back up the right half.
*/
- assert(oe->timer_idx != BINHEAP_NOIDX);
- binheap_delete(exp_heap, oe->timer_idx);
- assert(oe->timer_idx == BINHEAP_NOIDX);
- binheap_insert(exp_heap, oe);
- assert(oe->timer_idx != BINHEAP_NOIDX);
+ assert(oc->timer_idx != BINHEAP_NOIDX);
+ binheap_delete(exp_heap, oc->timer_idx);
+ assert(oc->timer_idx == BINHEAP_NOIDX);
+ binheap_insert(exp_heap, oc);
+ assert(oc->timer_idx != BINHEAP_NOIDX);
}
Lck_Unlock(&exp_mtx);
}
@@ -278,7 +258,7 @@
exp_timer(void *arg)
{
struct worker ww;
- struct objexp *oe;
+ struct objcore *oc;
struct object *o;
double t;
struct sess *sp;
@@ -299,9 +279,9 @@
t = TIM_real();
while (1) {
Lck_Lock(&exp_mtx);
- oe = binheap_root(exp_heap);
- CHECK_OBJ_ORNULL(oe, OBJEXP_MAGIC);
- if (oe == NULL || oe->timer_when > t) { /* XXX: > or >= ? */
+ oc = binheap_root(exp_heap);
+ CHECK_OBJ_ORNULL(oc, OBJCORE_MAGIC);
+ if (oc == NULL || oc->timer_when > t) { /* XXX: > or >= ? */
Lck_Unlock(&exp_mtx);
WSL_Flush(&ww, 0);
AZ(sleep(1));
@@ -310,26 +290,26 @@
continue;
}
- o = oe->obj;
+ o = oc->obj;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
- assert(oe->timer_idx != BINHEAP_NOIDX);
- binheap_delete(exp_heap, oe->timer_idx);
- assert(oe->timer_idx == BINHEAP_NOIDX);
+ assert(oc->timer_idx != BINHEAP_NOIDX);
+ binheap_delete(exp_heap, oc->timer_idx);
+ assert(oc->timer_idx == BINHEAP_NOIDX);
{ /* Sanity checking */
- struct objexp *oe2 = binheap_root(exp_heap);
- if (oe2 != NULL) {
- assert(oe2->timer_idx != BINHEAP_NOIDX);
- assert(oe2->timer_when >= oe->timer_when);
+ struct objcore *oc2 = binheap_root(exp_heap);
+ if (oc2 != NULL) {
+ assert(oc2->timer_idx != BINHEAP_NOIDX);
+ assert(oc2->timer_when >= oc->timer_when);
}
}
- assert(oe->on_lru);
+ assert(oc->on_lru);
Lck_Unlock(&exp_mtx);
- WSL(&ww, SLT_ExpPick, 0, "%u %s", o->xid, oe->timer_what);
+ WSL(&ww, SLT_ExpPick, 0, "%u %s", o->xid, oc->timer_what);
- if (oe->timer_what == tmr_prefetch) {
+ if (oc->timer_what == tmr_prefetch) {
o->prefetch = 0.0;
sp->obj = o;
VCL_prefetch_method(sp);
@@ -339,13 +319,13 @@
o->xid);
}
Lck_Lock(&exp_mtx);
- assert(oe->timer_idx == BINHEAP_NOIDX);
+ assert(oc->timer_idx == BINHEAP_NOIDX);
(void)update_object_when(o);
- binheap_insert(exp_heap, oe);
- assert(oe->timer_idx != BINHEAP_NOIDX);
+ binheap_insert(exp_heap, oc);
+ assert(oc->timer_idx != BINHEAP_NOIDX);
Lck_Unlock(&exp_mtx);
} else {
- assert(oe->timer_what == tmr_ttl);
+ assert(oc->timer_what == tmr_ttl);
sp->obj = o;
VCL_timeout_method(sp);
sp->obj = NULL;
@@ -354,12 +334,12 @@
WSL(&ww, SLT_ExpKill, 0,
"%u %d", o->xid, (int)(o->ttl - t));
Lck_Lock(&exp_mtx);
- assert(oe->timer_idx == BINHEAP_NOIDX);
- VTAILQ_REMOVE(&lru, o->objexp, list);
- oe->on_lru = 0;
+ assert(oc->timer_idx == BINHEAP_NOIDX);
+ VTAILQ_REMOVE(&lru, o->objcore, list);
+ oc->on_lru = 0;
VSL_stats->n_expired++;
Lck_Unlock(&exp_mtx);
- del_objexp(o);
+ del_objcore(o);
HSH_Deref(&o);
}
}
@@ -374,13 +354,13 @@
int
EXP_NukeOne(struct sess *sp)
{
- struct objexp *oe;
+ struct objcore *oc;
struct object *o;
/*
* Find the first currently unused object on the LRU.
*
- * Ideally we would have the refcnt in the objexp so we the object does
+ * Ideally we would have the refcnt in the objcore so we the object does
* not need to get paged in for this check, but it does not pay off
* the complexity: The chances of an object being in front of the LRU,
* with active references, likely means that it is already in core. An
@@ -390,29 +370,29 @@
* another ref while we ponder its destiny without the lock held.
*/
Lck_Lock(&exp_mtx);
- VTAILQ_FOREACH(oe, &lru, list) {
- CHECK_OBJ_NOTNULL(oe, OBJEXP_MAGIC);
- if (oe->timer_idx == BINHEAP_NOIDX) /* exp_timer has it */
+ VTAILQ_FOREACH(oc, &lru, list) {
+ CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+ if (oc->timer_idx == BINHEAP_NOIDX) /* exp_timer has it */
continue;
- if (oe->obj->refcnt == 1)
+ if (oc->obj->refcnt == 1)
break;
}
- if (oe != NULL) {
+ if (oc != NULL) {
/*
* We hazzard the guess that the object is more likely to
* be tossed than kept, and forge ahead on the work to save
* a lock cycle. If the object is kept, we reverse these
* actions below.
*/
- VTAILQ_REMOVE(&lru, oe, list);
- oe->on_lru = 0;
- binheap_delete(exp_heap, oe->timer_idx);
- assert(oe->timer_idx == BINHEAP_NOIDX);
+ VTAILQ_REMOVE(&lru, oc, list);
+ oc->on_lru = 0;
+ binheap_delete(exp_heap, oc->timer_idx);
+ assert(oc->timer_idx == BINHEAP_NOIDX);
VSL_stats->n_lru_nuked++;
}
Lck_Unlock(&exp_mtx);
- if (oe == NULL)
+ if (oc == NULL)
return (-1);
/*
@@ -421,14 +401,14 @@
* substitute the object we want to nuke for the sessions own object.
*/
o = sp->obj;
- sp->obj = oe->obj;
+ sp->obj = oc->obj;
VCL_discard_method(sp);
sp->obj = o;
- o = oe->obj;
+ o = oc->obj;
if (sp->handling == VCL_RET_DISCARD) {
WSL(sp->wrk, SLT_ExpKill, 0, "%u LRU", o->xid);
- del_objexp(o);
+ del_objcore(o);
HSH_Deref(&o);
return (1);
}
@@ -439,37 +419,37 @@
Lck_Lock(&exp_mtx);
VSL_stats->n_lru_nuked--; /* It was premature */
VSL_stats->n_lru_saved++;
- binheap_insert(exp_heap, oe);
- assert(oe->timer_idx != BINHEAP_NOIDX);
- VTAILQ_INSERT_TAIL(&lru, oe, list);
- oe->on_lru = 1;
+ binheap_insert(exp_heap, oc);
+ assert(oc->timer_idx != BINHEAP_NOIDX);
+ VTAILQ_INSERT_TAIL(&lru, oc, list);
+ oc->on_lru = 1;
Lck_Unlock(&exp_mtx);
return (0);
}
/*--------------------------------------------------------------------
- * BinHeap helper functions for objexp.
+ * BinHeap helper functions for objcore.
*/
static int
object_cmp(void *priv, void *a, void *b)
{
- struct objexp *aa, *bb;
+ struct objcore *aa, *bb;
(void)priv;
- CAST_OBJ_NOTNULL(aa, a, OBJEXP_MAGIC);
- CAST_OBJ_NOTNULL(bb, b, OBJEXP_MAGIC);
+ CAST_OBJ_NOTNULL(aa, a, OBJCORE_MAGIC);
+ CAST_OBJ_NOTNULL(bb, b, OBJCORE_MAGIC);
return (aa->timer_when < bb->timer_when);
}
static void
object_update(void *priv, void *p, unsigned u)
{
- struct objexp *oe;
+ struct objcore *oc;
(void)priv;
- CAST_OBJ_NOTNULL(oe, p, OBJEXP_MAGIC);
- oe->timer_idx = u;
+ CAST_OBJ_NOTNULL(oc, p, OBJCORE_MAGIC);
+ oc->timer_idx = u;
}
/*--------------------------------------------------------------------*/
More information about the varnish-commit
mailing list