From 436a16c6e09b8435fd897d930f26e44217a6f2db Mon Sep 17 00:00:00 2001 From: phk Date: Tue, 17 Feb 2009 10:06:19 +0000 Subject: [PATCH] Move the ttl from object up to the objcore git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@3779 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache.h | 2 +- varnish-cache/bin/varnishd/cache_ban.c | 4 ++-- varnish-cache/bin/varnishd/cache_center.c | 11 +++++++---- varnish-cache/bin/varnishd/cache_expire.c | 8 ++++---- varnish-cache/bin/varnishd/cache_hash.c | 17 +++++++++-------- varnish-cache/bin/varnishd/cache_vrt.c | 22 ++++++++++++++-------- varnish-cache/bin/varnishd/rfc2616.c | 9 ++++++--- 7 files changed, 43 insertions(+), 30 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache.h b/varnish-cache/bin/varnishd/cache.h index 8c185119..637aac60 100644 --- a/varnish-cache/bin/varnishd/cache.h +++ b/varnish-cache/bin/varnishd/cache.h @@ -262,6 +262,7 @@ struct objcore { #define OBJCORE_MAGIC 0x4d301302 struct object *obj; double timer_when; + double ttl; unsigned char timer_what; #define OC_T_TTL 1 #define OC_T_PREFETCH 2 @@ -298,7 +299,6 @@ struct object { double age; double entered; - double ttl; double grace; double prefetch; diff --git a/varnish-cache/bin/varnishd/cache_ban.c b/varnish-cache/bin/varnishd/cache_ban.c index a67401e3..7f922a7b 100644 --- a/varnish-cache/bin/varnishd/cache_ban.c +++ b/varnish-cache/bin/varnishd/cache_ban.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2006 Verdens Gang AS - * Copyright (c) 2006-2008 Linpro AS + * Copyright (c) 2006-2009 Linpro AS * All rights reserved. * * Author: Poul-Henning Kamp @@ -528,7 +528,7 @@ BAN_CheckObject(struct object *o, const struct sess *sp) o->ban = b0; return (0); } else { - o->ttl = 0; + o->objcore->ttl = 0; WSP(sp, SLT_ExpBan, "%u was banned", o->xid); EXP_Rearm(o); o->ban = NULL; diff --git a/varnish-cache/bin/varnishd/cache_center.c b/varnish-cache/bin/varnishd/cache_center.c index 6bd98ca0..9df0783e 100644 --- a/varnish-cache/bin/varnishd/cache_center.c +++ b/varnish-cache/bin/varnishd/cache_center.c @@ -378,6 +378,7 @@ static int cnt_fetch(struct sess *sp) { int i; + struct objcore *oc; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC); @@ -414,10 +415,12 @@ cnt_fetch(struct sess *sp) sp->step = STP_RECV; return (0); case VCL_RET_PASS: - if (sp->obj->objcore != NULL) - sp->obj->objcore->flags |= OC_F_PASS; - if (sp->obj->ttl - sp->t_req < params->default_ttl) - sp->obj->ttl = sp->t_req + params->default_ttl; + if (sp->obj->objcore != NULL) { + oc = sp->obj->objcore; + oc->flags |= OC_F_PASS; + if (oc->ttl - sp->t_req < params->default_ttl) + oc->ttl = sp->t_req + params->default_ttl; + } break; case VCL_RET_DELIVER: break; diff --git a/varnish-cache/bin/varnishd/cache_expire.c b/varnish-cache/bin/varnishd/cache_expire.c index 27eca861..e6f20e97 100644 --- a/varnish-cache/bin/varnishd/cache_expire.c +++ b/varnish-cache/bin/varnishd/cache_expire.c @@ -97,14 +97,14 @@ update_object_when(const struct object *o) Lck_AssertHeld(&exp_mtx); if (o->prefetch < 0.0) { - when = o->ttl + o->prefetch; + when = oc->ttl + o->prefetch; what = OC_T_PREFETCH; } else if (o->prefetch > 0.0) { - assert(o->prefetch <= o->ttl); + assert(o->prefetch <= oc->ttl); when = o->prefetch; what = OC_T_PREFETCH; } else { - when = o->ttl + HSH_Grace(o->grace); + when = oc->ttl + HSH_Grace(o->grace); what = OC_T_TTL; } assert(!isnan(when)); @@ -304,7 +304,7 @@ exp_timer(void *arg) assert(sp->handling == VCL_RET_DISCARD); WSL(&ww, SLT_ExpKill, 0, - "%u %d", o->xid, (int)(o->ttl - t)); + "%u %d", o->xid, (int)(o->objcore->ttl - t)); Lck_Lock(&exp_mtx); assert(oc->timer_idx == BINHEAP_NOIDX); VTAILQ_REMOVE(&lru, o->objcore, lru_list); diff --git a/varnish-cache/bin/varnishd/cache_hash.c b/varnish-cache/bin/varnishd/cache_hash.c index f5efca26..92f5de59 100644 --- a/varnish-cache/bin/varnishd/cache_hash.c +++ b/varnish-cache/bin/varnishd/cache_hash.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2006 Verdens Gang AS - * Copyright (c) 2006-2008 Linpro AS + * Copyright (c) 2006-2009 Linpro AS * All rights reserved. * * Author: Poul-Henning Kamp @@ -275,7 +275,7 @@ HSH_Lookup(struct sess *sp) } if (!o->cacheable) continue; - if (o->ttl == 0) + if (oc->ttl == 0) continue; if (BAN_CheckObject(o, sp)) continue; @@ -283,11 +283,11 @@ HSH_Lookup(struct sess *sp) continue; /* If still valid, use it */ - if (o->ttl >= sp->t_req) + if (oc->ttl >= sp->t_req) break; /* Remember any matching objects inside their grace period */ - if (o->ttl + HSH_Grace(o->grace) >= sp->t_req) + if (oc->ttl + HSH_Grace(o->grace) >= sp->t_req) grace_o = o; } if (oc == NULL) @@ -301,7 +301,7 @@ HSH_Lookup(struct sess *sp) */ if (o == NULL && grace_o != NULL && grace_o->child != NULL && - grace_o->ttl + HSH_Grace(sp->grace) >= sp->t_req) + grace_o->objcore->ttl + HSH_Grace(sp->grace) >= sp->t_req) o = grace_o; if (o != NULL) { @@ -377,10 +377,11 @@ HSH_Drop(struct sess *sp) CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); o = sp->obj; CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC); - if (o->objcore != NULL) /* Pass has no objcore */ - AN(ObjIsBusy(o)); assert(o->refcnt > 0); - o->ttl = 0; + if (o->objcore != NULL) { /* Pass has no objcore */ + AN(ObjIsBusy(o)); + o->objcore->ttl = 0; + } o->cacheable = 0; if (o->objcore != NULL) /* Pass has no objcore */ HSH_Unbusy(sp); diff --git a/varnish-cache/bin/varnishd/cache_vrt.c b/varnish-cache/bin/varnishd/cache_vrt.c index f9db47ae..86621b28 100644 --- a/varnish-cache/bin/varnishd/cache_vrt.c +++ b/varnish-cache/bin/varnishd/cache_vrt.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2006 Verdens Gang AS - * Copyright (c) 2006-2008 Linpro AS + * Copyright (c) 2006-2009 Linpro AS * All rights reserved. * * Author: Poul-Henning Kamp @@ -369,6 +369,8 @@ VRT_l_obj_ttl(const struct sess *sp, double a) CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC); /* XXX */ + if (sp->obj->objcore == NULL) + return; WSP(sp, SLT_TTL, "%u VCL %.0f %.0f", sp->obj->xid, a, sp->t_req); /* @@ -378,9 +380,9 @@ VRT_l_obj_ttl(const struct sess *sp, double a) * We special case and make sure that rounding does not surprise. */ if (a <= 0) - sp->obj->ttl = sp->t_req - 1; + sp->obj->objcore->ttl = sp->t_req - 1; else - sp->obj->ttl = sp->t_req + a; + sp->obj->objcore->ttl = sp->t_req + a; EXP_Rearm(sp->obj); } @@ -389,7 +391,9 @@ VRT_r_obj_ttl(const struct sess *sp) { CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC); /* XXX */ - return (sp->obj->ttl - sp->t_req); + if (sp->obj->objcore == NULL) + return (0.0); + return (sp->obj->objcore->ttl - sp->t_req); } /*-------------------------------------------------------------------- @@ -428,21 +432,23 @@ VRT_l_obj_prefetch(const struct sess *sp, double a) CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC); /* XXX */ + if (sp->obj->objcore == NULL) + return; sp->obj->prefetch = 0.0; if (a == 0.0) sp->obj->prefetch = a; - else if (a > 0.0 && a + sp->t_req <= sp->obj->ttl) + else if (a > 0.0 && a + sp->t_req <= sp->obj->objcore->ttl) sp->obj->prefetch = a + sp->t_req; - else if (a < 0.0 && a + sp->obj->ttl > sp->t_req) + else if (a < 0.0 && a + sp->obj->objcore->ttl > sp->t_req) sp->obj->prefetch = a; else if (a > 0.0) WSL(sp->wrk, SLT_VCL_info, sp->id, "XID %u: obj.prefetch (%g) after TTL (%g), ignored.", - sp->obj->xid, a, sp->obj->ttl - sp->t_req); + sp->obj->xid, a, sp->obj->objcore->ttl - sp->t_req); else /* if (a < 0.0) */ WSL(sp->wrk, SLT_VCL_info, sp->id, "XID %u: obj.prefetch (%g) less than ttl (%g), ignored.", - sp->obj->xid, a, sp->obj->ttl - sp->t_req); + sp->obj->xid, a, sp->obj->objcore->ttl - sp->t_req); EXP_Rearm(sp->obj); } diff --git a/varnish-cache/bin/varnishd/rfc2616.c b/varnish-cache/bin/varnishd/rfc2616.c index 5a6c46fc..12156ca5 100644 --- a/varnish-cache/bin/varnishd/rfc2616.c +++ b/varnish-cache/bin/varnishd/rfc2616.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2006 Verdens Gang AS - * Copyright (c) 2006-2008 Linpro AS + * Copyright (c) 2006-2009 Linpro AS * All rights reserved. * * Author: Poul-Henning Kamp @@ -173,6 +173,7 @@ int RFC2616_cache_policy(const struct sess *sp, const struct http *hp) { int body = 0; + double ttl; /* * Initial cacheability determination per [RFC2616, 13.4] @@ -196,8 +197,10 @@ RFC2616_cache_policy(const struct sess *sp, const struct http *hp) break; } - sp->obj->ttl = RFC2616_Ttl(sp, hp, sp->obj); - if (sp->obj->ttl == 0) + ttl = RFC2616_Ttl(sp, hp, sp->obj); + if (sp->obj->objcore != NULL) + sp->obj->objcore->ttl = ttl; + if (ttl == 0) sp->obj->cacheable = 0; return (body); -- 2.39.5