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