Commit 8105f420 authored by Kristian Lyngstøl's avatar Kristian Lyngstøl

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.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@5065 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 424456d9
......@@ -830,6 +830,11 @@ cnt_lookup(struct sess *sp)
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 @@ cnt_recv(struct sess *sp)
/* 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 @@ CNT_Session(struct sess *sp)
sp->step == STP_FIRST ||
sp->step == STP_START ||
sp->step == STP_LOOKUP ||
sp->step == STP_REFRESH ||
sp->step == STP_RECV);
/*
......
......@@ -402,7 +402,8 @@ HSH_Lookup(struct sess *sp, struct objhead **poh)
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 @@ HSH_Lookup(struct sess *sp, struct objhead **poh)
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) {
......
......@@ -36,6 +36,7 @@ STEP(start, START)
STEP(pipe, PIPE)
STEP(pass, PASS)
STEP(lookup, LOOKUP)
STEP(refresh, REFRESH)
STEP(miss, MISS)
STEP(hit, HIT)
STEP(fetch, FETCH)
......
......@@ -310,6 +310,11 @@ vcl_recv
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
......
......@@ -84,7 +84,7 @@ tokens = {
# 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',)),
......
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