r5065 - in trunk/varnish-cache: bin/varnishd doc/sphinx/reference lib/libvcl
kristian at varnish-cache.org
kristian at varnish-cache.org
Mon Aug 2 21:14:15 CEST 2010
Author: kristian
Date: 2010-08-02 21:14:15 +0200 (Mon, 02 Aug 2010)
New Revision: 5065
Modified:
trunk/varnish-cache/bin/varnishd/cache_center.c
trunk/varnish-cache/bin/varnishd/cache_hash.c
trunk/varnish-cache/bin/varnishd/steps.h
trunk/varnish-cache/doc/sphinx/reference/vcl.rst
trunk/varnish-cache/lib/libvcl/generate.py
Log:
Return(refresh) from VCL recv, allowing a controlled refresh of content
(for example from a script). Does not deal with Vary in any particular
fashion.
Modified: trunk/varnish-cache/bin/varnishd/cache_center.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_center.c 2010-08-02 18:30:38 UTC (rev 5064)
+++ trunk/varnish-cache/bin/varnishd/cache_center.c 2010-08-02 19:14:15 UTC (rev 5065)
@@ -830,6 +830,11 @@
return (0);
}
+static int
+cnt_refresh(struct sess *sp)
+{
+ return cnt_lookup(sp);
+}
/*--------------------------------------------------------------------
* We had a miss, ask VCL, proceed as instructed
*
@@ -1063,6 +1068,9 @@
/* XXX: discard req body, if any */
sp->step = STP_LOOKUP;
return (0);
+ case VCL_RET_REFRESH:
+ sp->step = STP_REFRESH;
+ return (0);
case VCL_RET_PIPE:
if (sp->esis > 0) {
/* XXX: VSL something */
@@ -1207,6 +1215,7 @@
sp->step == STP_FIRST ||
sp->step == STP_START ||
sp->step == STP_LOOKUP ||
+ sp->step == STP_REFRESH ||
sp->step == STP_RECV);
/*
Modified: trunk/varnish-cache/bin/varnishd/cache_hash.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_hash.c 2010-08-02 18:30:38 UTC (rev 5064)
+++ trunk/varnish-cache/bin/varnishd/cache_hash.c 2010-08-02 19:14:15 UTC (rev 5065)
@@ -402,7 +402,8 @@
if (oc == NULL /* We found no live object */
&& grace_oc != NULL /* There is a grace candidate */
&& (busy_oc != NULL /* Somebody else is already busy */
- || !VBE_Healthy(sp->t_req, sp->director, (uintptr_t)oh))) {
+ || !VBE_Healthy(sp->t_req, sp->director, (uintptr_t)oh))
+ && sp->step != STP_REFRESH) {
/* Or it is impossible to fetch: */
o = grace_oc->obj;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
@@ -414,16 +415,24 @@
o = oc->obj;
CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
assert(oc->objhead == oh);
-
- /* We found an object we like */
- oc->refcnt++;
- if (o->hits < INT_MAX)
- o->hits++;
- assert(oh->refcnt > 1);
- Lck_Unlock(&oh->mtx);
- assert(hash->deref(oh));
- *poh = oh;
- return (oc);
+ if (sp->step == STP_REFRESH) {
+ if (o->ttl >= sp->t_req) {
+ o->ttl = sp->t_req - 1;
+ o->grace = HSH_Grace(sp->grace);
+ EXP_Rearm(o);
+ }
+ o = NULL;
+ } else {
+ /* We found an object we like */
+ oc->refcnt++;
+ if (o->hits < INT_MAX)
+ o->hits++;
+ assert(oh->refcnt > 1);
+ Lck_Unlock(&oh->mtx);
+ assert(hash->deref(oh));
+ *poh = oh;
+ return (oc);
+ }
}
if (busy_oc != NULL) {
Modified: trunk/varnish-cache/bin/varnishd/steps.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/steps.h 2010-08-02 18:30:38 UTC (rev 5064)
+++ trunk/varnish-cache/bin/varnishd/steps.h 2010-08-02 19:14:15 UTC (rev 5065)
@@ -36,6 +36,7 @@
STEP(pipe, PIPE)
STEP(pass, PASS)
STEP(lookup, LOOKUP)
+STEP(refresh, REFRESH)
STEP(miss, MISS)
STEP(hit, HIT)
STEP(fetch, FETCH)
Modified: trunk/varnish-cache/doc/sphinx/reference/vcl.rst
===================================================================
--- trunk/varnish-cache/doc/sphinx/reference/vcl.rst 2010-08-02 18:30:38 UTC (rev 5064)
+++ trunk/varnish-cache/doc/sphinx/reference/vcl.rst 2010-08-02 19:14:15 UTC (rev 5065)
@@ -310,6 +310,11 @@
pipe
Switch to pipe mode. Control will eventually pass to vcl_pipe.
+ refresh
+ Go through normal caching channels, but guarantee a cache miss even if
+ there is valid content in the cache, thereby performing a controlled
+ refresh of the content.
+
lookup
Look up the requested object in the cache. Control will
eventually pass to vcl_hit or vcl_miss, depending on whether the
Modified: trunk/varnish-cache/lib/libvcl/generate.py
===================================================================
--- trunk/varnish-cache/lib/libvcl/generate.py 2010-08-02 18:30:38 UTC (rev 5064)
+++ trunk/varnish-cache/lib/libvcl/generate.py 2010-08-02 19:14:15 UTC (rev 5065)
@@ -84,7 +84,7 @@
# Our methods and actions
returns =(
- ('recv', ('error', 'pass', 'pipe', 'lookup',)),
+ ('recv', ('error', 'pass', 'pipe', 'refresh','lookup',)),
('pipe', ('error', 'pipe',)),
('pass', ('error', 'restart', 'pass',)),
('hash', ('hash',)),
More information about the varnish-commit
mailing list