Commit a3456767 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Move the objhead reference from the object to the objcore, we need it

for expiry of non-instantiated objects from -spersistent



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@4194 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 06c03e63
......@@ -281,6 +281,7 @@ struct objcore {
unsigned magic;
#define OBJCORE_MAGIC 0x4d301302
struct object *obj;
struct objhead *objhead;
double timer_when;
unsigned char flags;
#define OC_F_ONLRU (1<<0)
......@@ -301,7 +302,6 @@ struct object {
#define OBJECT_MAGIC 0x32851d42
unsigned refcnt;
unsigned xid;
struct objhead *objhead;
struct storage *objstore;
struct objcore *objcore;
......
......@@ -157,9 +157,10 @@ ban_cond_hash(const struct ban_test *bt, const struct object *o,
{
(void)sp;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
CHECK_OBJ_NOTNULL(o->objhead, OBJHEAD_MAGIC);
AN(o->objhead->hash);
return(ban_cond_str(bt, o->objhead->hash));
CHECK_OBJ_NOTNULL(o->objcore, OBJCORE_MAGIC);
CHECK_OBJ_NOTNULL(o->objcore->objhead, OBJHEAD_MAGIC);
AN(o->objcore->objhead->hash);
return(ban_cond_str(bt, o->objcore->objhead->hash));
}
static int
......
......@@ -175,7 +175,7 @@ cnt_deliver(struct sess *sp)
CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC);
sp->t_resp = TIM_real();
if (sp->obj->objhead != NULL) {
if (sp->obj->objcore != NULL) {
if ((sp->t_resp - sp->obj->last_lru) > params->lru_timeout &&
EXP_Touch(sp->obj))
sp->obj->last_lru = sp->t_resp; /* XXX: locking ? */
......@@ -505,7 +505,7 @@ cnt_fetch(struct sess *sp)
CHECK_OBJ_NOTNULL(sp->objcore, OBJCORE_MAGIC);
sp->objcore->obj = sp->obj;
sp->obj->objcore = sp->objcore;
sp->obj->objhead = sp->objhead;
sp->objcore->objhead = sp->objhead;
sp->objhead = NULL; /* refcnt follows pointer. */
sp->objcore = NULL; /* refcnt follows pointer. */
}
......
......@@ -128,11 +128,10 @@ EXP_Insert(struct object *o)
struct objcore_head *lru;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
AN(o->objhead);
CHECK_OBJ_NOTNULL(o->objcore, OBJCORE_MAGIC);
AN(ObjIsBusy(o));
assert(o->cacheable);
HSH_Ref(o);
CHECK_OBJ_NOTNULL(o->objcore, OBJCORE_MAGIC);
oc = o->objcore;
assert(o->entered != 0 && !isnan(o->entered));
......@@ -175,8 +174,8 @@ EXP_Touch(const struct object *o)
lru = STV_lru(o->objstore);
if (lru == NULL)
return (retval);
AN(o->objhead);
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
CHECK_OBJ_NOTNULL(oc->objhead, OBJHEAD_MAGIC);
if (Lck_Trylock(&exp_mtx))
return (retval);
if (oc->flags & OC_F_ONLRU) {
......@@ -274,11 +273,13 @@ exp_timer(struct sess *sp, void *priv)
/* And from LRU */
if (oc->flags & OC_F_ONLRU) {
assert(!(oc->flags & OC_F_PERSISTENT));
o = oc->obj;
lru = STV_lru(o->objstore);
AN(lru);
VTAILQ_REMOVE(lru, o->objcore, lru_list);
oc->flags &= ~OC_F_ONLRU;
} else {
o = NULL;
assert(oc->flags & OC_F_PERSISTENT);
}
......@@ -289,11 +290,14 @@ exp_timer(struct sess *sp, void *priv)
if (!(oc->flags & OC_F_PERSISTENT)) {
o = oc->obj;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
CHECK_OBJ_NOTNULL(oc->objhead, OBJHEAD_MAGIC);
WSL(sp->wrk, SLT_ExpKill, 0, "%u %d",
o->xid, (int)(o->ttl - t));
HSH_Deref(sp->wrk, &o);
CHECK_OBJ_NOTNULL(o->objhead, OBJHEAD_MAGIC);
} else {
WSL(sp->wrk, SLT_ExpKill, 0, "%u %d",
o, (int)(oc->timer_when - t));
}
WSL(sp->wrk, SLT_ExpKill, 0, "%u %d",
o->xid, (int)(o->ttl - t));
}
}
......
......@@ -589,7 +589,8 @@ HSH_Unbusy(const struct sess *sp)
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
o = sp->obj;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
oh = o->objhead;
CHECK_OBJ_NOTNULL(o->objcore, OBJCORE_MAGIC);
oh = o->objcore->objhead;
CHECK_OBJ(oh, OBJHEAD_MAGIC);
AN(ObjIsBusy(o));
......@@ -616,7 +617,8 @@ HSH_Ref(struct object *o)
struct objhead *oh;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
oh = o->objhead;
CHECK_OBJ_NOTNULL(o->objcore, OBJCORE_MAGIC);
oh = o->objcore->objhead;
CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
Lck_Lock(&oh->mtx);
assert(o->refcnt > 0);
......@@ -660,16 +662,15 @@ HSH_Deref(const struct worker *w, struct object **oo)
o = *oo;
*oo = NULL;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
oh = o->objhead;
if (oh == NULL) {
oc = NULL;
oc = o->objcore;
if (oc == NULL) {
assert(o->refcnt > 0);
r = --o->refcnt;
oh = NULL;
} else {
CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
oc = o->objcore;
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
oh = oc->objhead;
CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
Lck_Lock(&oh->mtx);
assert(oh->refcnt > 0);
......@@ -706,11 +707,11 @@ HSH_Deref(const struct worker *w, struct object **oo)
o = NULL;
w->stats->n_object--;
if (oh == NULL) {
AZ(oc);
if (oc == NULL) {
AZ(oh);
return;
}
AN(oc);
AN(oh);
FREE_OBJ(oc);
/* Drop our ref on the objhead */
assert(oh->refcnt > 0);
......
......@@ -731,10 +731,11 @@ VRT_r_obj_hash(const struct sess *sp)
if (sp->obj == NULL)
return (NULL);
CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC);
if (sp->obj->objhead == NULL)
if (sp->obj->objcore == NULL)
return (NULL);
CHECK_OBJ_NOTNULL(sp->obj->objhead, OBJHEAD_MAGIC);
return (sp->obj->objhead->hash);
CHECK_OBJ_NOTNULL(sp->obj->objcore, OBJCORE_MAGIC);
CHECK_OBJ_NOTNULL(sp->obj->objcore->objhead, OBJHEAD_MAGIC);
return (sp->obj->objcore->objhead->hash);
}
unsigned
......
......@@ -623,7 +623,7 @@ SMP_Fixup(struct sess *sp, struct objhead *oh, struct objcore *oc)
/* refcnt is one because the object is in the hash */
oc->obj->refcnt = 1;
oc->obj->objcore = oc;
oc->obj->objhead = oh;
oc->objhead = oh;
oc->obj->ban = oc->ban;
sg->nfixed++;
......@@ -1067,7 +1067,7 @@ smp_object(const struct sess *sp)
}
assert(sg->nalloc < sg->maxobj);
so = &sg->objs[sg->nalloc++];
memcpy(so->hash, sp->obj->objhead->digest, DIGEST_LEN);
memcpy(so->hash, sp->obj->objcore->objhead->digest, DIGEST_LEN);
so->ttl = sp->obj->ttl;
so->ptr = sp->obj;
so->ban = sp->obj->ban_t;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment