r4208 - in trunk/varnish-cache: bin/varnishd bin/varnishtest/tests include lib/libvcl

kristian at projects.linpro.no kristian at projects.linpro.no
Mon Aug 24 16:51:26 CEST 2009


Author: kristian
Date: 2009-08-24 16:51:26 +0200 (Mon, 24 Aug 2009)
New Revision: 4208

Added:
   trunk/varnish-cache/bin/varnishtest/tests/s00003.vtc
Modified:
   trunk/varnish-cache/bin/varnishd/cache_backend.c
   trunk/varnish-cache/bin/varnishd/cache_backend.h
   trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c
   trunk/varnish-cache/bin/varnishd/cache_dir_random.c
   trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c
   trunk/varnish-cache/bin/varnishd/cache_dir_simple.c
   trunk/varnish-cache/bin/varnishd/cache_hash.c
   trunk/varnish-cache/bin/varnishd/cache_vrt.c
   trunk/varnish-cache/include/vrt_obj.h
   trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c
   trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl
   trunk/varnish-cache/lib/libvcl/vcc_obj.c
Log:
Saint mode: add beresp.saintmode to vcl_fetch.

This allows us to put items on a blacklist for a specific backend based on
the response it gave us. The basic syntax is (vcl_fetch):

if (beresp.status == 500) {
	set beresp.saintmode = 20s;
	restart;
}

Health checks are modified accordingly, which means graced objects are used
if no healthy backends are left to try.

Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_backend.c	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/bin/varnishd/cache_backend.c	2009-08-24 14:51:26 UTC (rev 4208)
@@ -228,6 +228,52 @@
 	sp->vbe = sp->director->getfd(sp);
 }
 
+/*
+ * It evaluates if a backend is healthy _for_a_specific_object_.
+ * That means that it relies on sp->objhead. This is mainly for saint-mode,
+ * but also takes backend->healthy into account.
+ */
+unsigned int
+backend_is_healthy(const struct sess *sp, struct backend *backend)
+{
+	struct trouble *tr;
+	struct trouble *tr2;
+	struct trouble *old = NULL;
+
+	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	CHECK_OBJ_NOTNULL(backend, BACKEND_MAGIC);
+
+	if (!backend->healthy)
+		return 0;
+
+	/* No need to test if we don't have an object head to test against.
+	 * FIXME: Should check the magic too, but probably not assert?
+	 */
+	if (!sp->objhead)
+		return 1;
+
+	Lck_Lock(&backend->mtx);
+	VTAILQ_FOREACH_SAFE(tr, &backend->troublelist, list, tr2) {
+		CHECK_OBJ_NOTNULL(tr, TROUBLE_MAGIC);
+		if (tr->timeout < sp->t_req) {
+			VTAILQ_REMOVE(&backend->troublelist, tr, list);
+			old = tr;
+			break;
+		}
+
+		if (tr->objhead == sp->objhead) {
+			Lck_Unlock(&backend->mtx);
+			return 0;
+		}
+	}
+	Lck_Unlock(&backend->mtx);
+
+	if (old)
+		FREE_OBJ(old);
+
+	return 1;
+}
+
 /*--------------------------------------------------------------------
  * Get a connection to a particular backend.
  */
@@ -265,7 +311,7 @@
 		VBE_ClosedFd(sp);
 	}
 
-	if (!bp->healthy) {
+	if (!backend_is_healthy(sp, bp)) {
 		VSL_stats->backend_unhealthy++;
 		return (NULL);
 	}

Modified: trunk/varnish-cache/bin/varnishd/cache_backend.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_backend.h	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/bin/varnishd/cache_backend.h	2009-08-24 14:51:26 UTC (rev 4208)
@@ -93,6 +93,18 @@
 };
 
 /*--------------------------------------------------------------------
+ * List of objectheads that have recently been rejected by VCL.
+ */
+
+struct trouble {
+	unsigned		magic;
+#define TROUBLE_MAGIC		0x4211ab21
+	void			*objhead; /* NB: only comparison */
+	double			timeout;
+	VTAILQ_ENTRY(trouble)	list;
+};
+
+/*--------------------------------------------------------------------
  * An instance of a backend from a VCL program.
  */
 
@@ -124,11 +136,13 @@
 
 	struct vbp_target	*probe;
 	unsigned		healthy;
+	VTAILQ_HEAD(, trouble)	troublelist;
 };
 
 /* cache_backend.c */
 void VBE_ReleaseConn(struct vbe_conn *vc);
 struct vbe_conn *VBE_GetVbe(struct sess *sp, struct backend *bp);
+unsigned int backend_is_healthy(const struct sess *sp, struct backend *backend);
 
 /* cache_backend_cfg.c */
 extern struct lock VBE_mtx;

Modified: trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c	2009-08-24 14:51:26 UTC (rev 4208)
@@ -226,6 +226,8 @@
 	VTAILQ_INIT(&b->connlist);
 	b->hash = u;
 
+	VTAILQ_INIT(&b->troublelist);
+
 	/*
 	 * This backend may live longer than the VCL that instantiated it
 	 * so we cannot simply reference the VCL's copy of things.

Modified: trunk/varnish-cache/bin/varnishd/cache_dir_random.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_dir_random.c	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/bin/varnishd/cache_dir_random.c	2009-08-24 14:51:26 UTC (rev 4208)
@@ -81,7 +81,7 @@
 		/* Sum up the weights of healty backends */
 		s1 = 0.0;
 		for (i = 0; i < vs->nhosts; i++)
-			if (vs->hosts[i].backend->healthy)
+			if (backend_is_healthy(sp,vs->hosts[i].backend))
 				s1 += vs->hosts[i].weight;
 
 		if (s1 == 0.0)
@@ -94,7 +94,7 @@
 
 		s1 = 0.0;
 		for (i = 0; i < vs->nhosts; i++)  {
-			if (!vs->hosts[i].backend->healthy)
+			if (!backend_is_healthy(sp, vs->hosts[i].backend))
 				continue;
 			s1 += vs->hosts[i].weight;
 			if (r >= s1)
@@ -120,7 +120,7 @@
 	CAST_OBJ_NOTNULL(vs, sp->director->priv, VDI_RANDOM_MAGIC);
 
 	for (i = 0; i < vs->nhosts; i++) {
-		if (vs->hosts[i].backend->healthy)
+		if (backend_is_healthy(sp,vs->hosts[i].backend))
 			return 1;
 	}
 	return 0;

Modified: trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/bin/varnishd/cache_dir_round_robin.c	2009-08-24 14:51:26 UTC (rev 4208)
@@ -75,7 +75,7 @@
 	for (i = 0; i < vs->nhosts; i++) {
 		backend = vs->hosts[vs->next_host].backend;
 		vs->next_host = (vs->next_host + 1) % vs->nhosts;
-		if (!backend->healthy)
+		if (!backend_is_healthy(sp, backend))
 			continue;
 		vbe = VBE_GetVbe(sp, backend);
 		if (vbe != NULL)
@@ -96,7 +96,7 @@
 	CAST_OBJ_NOTNULL(vs, sp->director->priv, VDI_ROUND_ROBIN_MAGIC);
 
 	for (i = 0; i < vs->nhosts; i++) {
-		if (vs->hosts[i].backend->healthy)
+		if (backend_is_healthy(sp, vs->hosts[i].backend))
 			return 1;
 	}
 	return 0;

Modified: trunk/varnish-cache/bin/varnishd/cache_dir_simple.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_dir_simple.c	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/bin/varnishd/cache_dir_simple.c	2009-08-24 14:51:26 UTC (rev 4208)
@@ -75,7 +75,7 @@
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 	CHECK_OBJ_NOTNULL(sp->director, DIRECTOR_MAGIC);
 	CAST_OBJ_NOTNULL(vs, sp->director->priv, VDI_SIMPLE_MAGIC);
-	return vs->backend->healthy;
+	return (backend_is_healthy(sp, vs->backend));
 }
 
 /*lint -e{818} not const-able */

Modified: trunk/varnish-cache/bin/varnishd/cache_hash.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_hash.c	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/bin/varnishd/cache_hash.c	2009-08-24 14:51:26 UTC (rev 4208)
@@ -493,6 +493,11 @@
 	 * XXX: this until the object is unbusy'ed, so in practice we
 	 * XXX: serialize fetch of all Vary's if grace is possible.
 	 */
+	/* Grace-stuff: sp->objhead is evaluated in healthy() for 'saint
+	 * mode'. Is this entirely wrong, or just ugly? Why isn't objhead
+	 * set here? FIXME:Grace.
+	 */
+	sp->objhead = oh;
 	if (oc == NULL && grace_oc != NULL && 
 	    (busy_oc != NULL || !sp->director->healthy(sp))) {
 		o = grace_oc->obj;
@@ -500,6 +505,7 @@
 		if (o->ttl + HSH_Grace(sp->grace) >= sp->t_req)
 			oc = grace_oc;
 	}
+	sp->objhead = NULL;
 
 	if (oc != NULL) {
 		o = oc->obj;

Modified: trunk/varnish-cache/bin/varnishd/cache_vrt.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_vrt.c	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/bin/varnishd/cache_vrt.c	2009-08-24 14:51:26 UTC (rev 4208)
@@ -279,6 +279,59 @@
 	http_SetH(sp->obj->http, HTTP_HDR_STATUS, p);
 }
 
+/* Add an objecthead to the saintmode list for the (hopefully) relevant
+ * backend. Some double-up asserting here to avoid assert-errors when there
+ * is no object. 
+ */
+void
+VRT_l_beresp_saintmode(const struct sess *sp, double a)
+{
+	struct trouble *new;
+	struct trouble *tr;
+	struct trouble *tr2;
+
+	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	if (!sp->vbe)
+		return;
+	CHECK_OBJ_NOTNULL(sp->vbe, VBE_CONN_MAGIC);
+	if (!sp->vbe->backend)
+		return;
+	CHECK_OBJ_NOTNULL(sp->vbe->backend, BACKEND_MAGIC);
+	if (!sp->objhead)
+		return;
+	CHECK_OBJ_NOTNULL(sp->objhead, OBJHEAD_MAGIC);
+
+	/* Setting a negative holdoff period is a mistake. Detecting this
+	 * when compiling the VCL would be better.
+	 */
+	assert(a > 0);
+	
+	ALLOC_OBJ(new, TROUBLE_MAGIC);
+	new->objhead = sp->objhead;
+	new->timeout = sp->t_req + a;
+
+	/* Insert the new item on the list before the first item with a
+	 * timeout at a later date (ie: sort by which entry will time out
+	 * from the list
+	 */	
+	Lck_Lock(&sp->vbe->backend->mtx);
+	VTAILQ_FOREACH_SAFE(tr, &sp->vbe->backend->troublelist, list, tr2) {
+		if (tr->timeout < new->timeout) {
+			VTAILQ_INSERT_BEFORE(tr, new, list);
+			new = NULL;
+			break;
+		}
+	}
+
+	/* Insert the item at the end if the list is empty or all other
+	 * items have a longer timeout.
+	 */
+	if (new)
+		VTAILQ_INSERT_TAIL(&sp->vbe->backend->troublelist, new, list);
+	
+	Lck_Unlock(&sp->vbe->backend->mtx);
+}
+
 int
 VRT_r_obj_status(const struct sess *sp)
 {

Added: trunk/varnish-cache/bin/varnishtest/tests/s00003.vtc
===================================================================
--- trunk/varnish-cache/bin/varnishtest/tests/s00003.vtc	                        (rev 0)
+++ trunk/varnish-cache/bin/varnishtest/tests/s00003.vtc	2009-08-24 14:51:26 UTC (rev 4208)
@@ -0,0 +1,57 @@
+# $Id$
+
+test "Check saint mode with sick pages"
+
+server s1 -listen 127.0.0.1:9080 {
+	timeout 10
+
+	rxreq
+	expect req.url == "/"
+	txresp -status 200 -hdr "foo: 1"
+	rxreq
+	expect req.url == "/"
+	txresp -status 200 -hdr "foo: 2"
+	rxreq
+	expect req.url == "/"
+	txresp -status 200 -hdr "foo: 3"
+} -start
+
+varnish v1 -vcl {
+	backend b { .host = "127.0.0.1"; .port = "9080"; }
+	sub vcl_fetch {
+		set beresp.ttl = 1s;
+		set beresp.grace = 10m;
+		set beresp.cacheable = true;
+		if (beresp.http.foo == "2")
+		{
+			set beresp.saintmode = 2s;
+			restart;
+		}
+		deliver;
+	}
+} -start
+
+client c1 {
+	txreq -url "/"
+	rxresp
+	expect resp.status == 200
+	expect resp.http.foo == 1
+} -run
+
+delay 2
+
+client c2 {
+	txreq -url "/"
+	rxresp
+	expect resp.status == 200
+	expect resp.http.foo == 1
+} -run
+
+delay 2
+
+client c3 {
+	txreq -url "/"
+	rxresp
+	expect resp.status == 200
+	expect resp.http.foo == 3
+} -run

Modified: trunk/varnish-cache/include/vrt_obj.h
===================================================================
--- trunk/varnish-cache/include/vrt_obj.h	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/include/vrt_obj.h	2009-08-24 14:51:26 UTC (rev 4208)
@@ -41,6 +41,7 @@
 void VRT_l_bereq_between_bytes_timeout(struct sess *, double);
 const char * VRT_r_beresp_proto(const struct sess *);
 void VRT_l_beresp_proto(const struct sess *, const char *, ...);
+void VRT_l_beresp_saintmode(const struct sess *, double);
 int VRT_r_beresp_status(const struct sess *);
 void VRT_l_beresp_status(const struct sess *, int);
 const char * VRT_r_beresp_response(const struct sess *);

Modified: trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/lib/libvcl/vcc_fixed_token.c	2009-08-24 14:51:26 UTC (rev 4208)
@@ -1,5 +1,5 @@
 /*
- * $Id: vcc_gen_fixed_token.tcl 4188 2009-08-18 08:29:27Z phk $
+ * $Id$
  *
  * NB:  This file is machine generated, DO NOT EDIT!
  *
@@ -159,10 +159,9 @@
 
 	/* ../../include/vcl.h */
 
-	vsb_cat(sb, "/*\n * $Id: vcc_gen_fixed_token.tcl 4188 2009-08-18 08");
-	vsb_cat(sb, ":29:27Z phk $\n *\n * NB:  This file is machine genera");
-	vsb_cat(sb, "ted, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_t");
-	vsb_cat(sb, "oken.tcl instead\n */\n\nstruct sess;\n");
+	vsb_cat(sb, "/*\n * $Id$\n *\n * NB:  This file is machine generate");
+	vsb_cat(sb, "d, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_tok");
+	vsb_cat(sb, "en.tcl instead\n */\n\nstruct sess;\n");
 	vsb_cat(sb, "struct cli;\n\ntypedef void vcl_init_f(struct cli *);\n");
 	vsb_cat(sb, "typedef void vcl_fini_f(struct cli *);\n");
 	vsb_cat(sb, "typedef int vcl_func_f(struct sess *sp);\n");
@@ -228,15 +227,15 @@
 	vsb_cat(sb, " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWI");
 	vsb_cat(sb, "SE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFT");
 	vsb_cat(sb, "WARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n");
-	vsb_cat(sb, " * SUCH DAMAGE.\n *\n * $Id: vrt.h 4185 2009-08-17 11:");
-	vsb_cat(sb, "53:01Z phk $\n *\n * Runtime support for compiled VCL ");
-	vsb_cat(sb, "programs.\n *\n * XXX: When this file is changed, lib/");
-	vsb_cat(sb, "libvcl/vcc_gen_fixed_token.tcl\n");
-	vsb_cat(sb, " * XXX: *MUST* be rerun.\n */\n");
-	vsb_cat(sb, "\nstruct sess;\nstruct vsb;\nstruct cli;\n");
-	vsb_cat(sb, "struct director;\nstruct VCL_conf;\n");
-	vsb_cat(sb, "struct sockaddr;\n\n/*\n * A backend probe specificati");
-	vsb_cat(sb, "on\n */\n\nextern void *vrt_magic_string_end;\n");
+	vsb_cat(sb, " * SUCH DAMAGE.\n *\n * $Id$\n *\n");
+	vsb_cat(sb, " * Runtime support for compiled VCL programs.\n");
+	vsb_cat(sb, " *\n * XXX: When this file is changed, lib/libvcl/vcc_");
+	vsb_cat(sb, "gen_fixed_token.tcl\n * XXX: *MUST* be rerun.\n");
+	vsb_cat(sb, " */\n\nstruct sess;\nstruct vsb;\n");
+	vsb_cat(sb, "struct cli;\nstruct director;\n");
+	vsb_cat(sb, "struct VCL_conf;\nstruct sockaddr;\n");
+	vsb_cat(sb, "\n/*\n * A backend probe specification\n");
+	vsb_cat(sb, " */\n\nextern void *vrt_magic_string_end;\n");
 	vsb_cat(sb, "\nstruct vrt_backend_probe {\n\tconst char\t*url;\n");
 	vsb_cat(sb, "\tconst char\t*request;\n\tdouble\t\ttimeout;\n");
 	vsb_cat(sb, "\tdouble\t\tinterval;\n\tunsigned\twindow;\n");
@@ -317,26 +316,25 @@
 
 	/* ../../include/vrt_obj.h */
 
-	vsb_cat(sb, "/*\n * $Id: vcc_gen_fixed_token.tcl 4188 2009-08-18 08");
-	vsb_cat(sb, ":29:27Z phk $\n *\n * NB:  This file is machine genera");
-	vsb_cat(sb, "ted, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_t");
-	vsb_cat(sb, "oken.tcl instead\n */\n\nstruct sockaddr * VRT_r_clien");
-	vsb_cat(sb, "t_ip(const struct sess *);\nstruct sockaddr * VRT_r_se");
-	vsb_cat(sb, "rver_ip(struct sess *);\nconst char * VRT_r_server_hos");
-	vsb_cat(sb, "tname(struct sess *);\nconst char * VRT_r_server_ident");
-	vsb_cat(sb, "ity(struct sess *);\nint VRT_r_server_port(struct sess");
-	vsb_cat(sb, " *);\nconst char * VRT_r_req_request(const struct sess");
-	vsb_cat(sb, " *);\nvoid VRT_l_req_request(const struct sess *, cons");
-	vsb_cat(sb, "t char *, ...);\nconst char * VRT_r_req_url(const stru");
-	vsb_cat(sb, "ct sess *);\nvoid VRT_l_req_url(const struct sess *, c");
-	vsb_cat(sb, "onst char *, ...);\nconst char * VRT_r_req_proto(const");
-	vsb_cat(sb, " struct sess *);\nvoid VRT_l_req_proto(const struct se");
-	vsb_cat(sb, "ss *, const char *, ...);\nvoid VRT_l_req_hash(struct ");
-	vsb_cat(sb, "sess *, const char *);\nstruct director * VRT_r_req_ba");
-	vsb_cat(sb, "ckend(struct sess *);\nvoid VRT_l_req_backend(struct s");
-	vsb_cat(sb, "ess *, struct director *);\nint VRT_r_req_restarts(con");
-	vsb_cat(sb, "st struct sess *);\ndouble VRT_r_req_grace(struct sess");
-	vsb_cat(sb, " *);\nvoid VRT_l_req_grace(struct sess *, double);\n");
+	vsb_cat(sb, "/*\n * $Id$\n *\n * NB:  This file is machine generate");
+	vsb_cat(sb, "d, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_tok");
+	vsb_cat(sb, "en.tcl instead\n */\n\nstruct sockaddr * VRT_r_client_");
+	vsb_cat(sb, "ip(const struct sess *);\nstruct sockaddr * VRT_r_serv");
+	vsb_cat(sb, "er_ip(struct sess *);\nconst char * VRT_r_server_hostn");
+	vsb_cat(sb, "ame(struct sess *);\nconst char * VRT_r_server_identit");
+	vsb_cat(sb, "y(struct sess *);\nint VRT_r_server_port(struct sess *");
+	vsb_cat(sb, ");\nconst char * VRT_r_req_request(const struct sess *");
+	vsb_cat(sb, ");\nvoid VRT_l_req_request(const struct sess *, const ");
+	vsb_cat(sb, "char *, ...);\nconst char * VRT_r_req_url(const struct");
+	vsb_cat(sb, " sess *);\nvoid VRT_l_req_url(const struct sess *, con");
+	vsb_cat(sb, "st char *, ...);\nconst char * VRT_r_req_proto(const s");
+	vsb_cat(sb, "truct sess *);\nvoid VRT_l_req_proto(const struct sess");
+	vsb_cat(sb, " *, const char *, ...);\nvoid VRT_l_req_hash(struct se");
+	vsb_cat(sb, "ss *, const char *);\nstruct director * VRT_r_req_back");
+	vsb_cat(sb, "end(struct sess *);\nvoid VRT_l_req_backend(struct ses");
+	vsb_cat(sb, "s *, struct director *);\nint VRT_r_req_restarts(const");
+	vsb_cat(sb, " struct sess *);\ndouble VRT_r_req_grace(struct sess *");
+	vsb_cat(sb, ");\nvoid VRT_l_req_grace(struct sess *, double);\n");
 	vsb_cat(sb, "const char * VRT_r_req_xid(struct sess *);\n");
 	vsb_cat(sb, "unsigned VRT_r_req_esi(struct sess *);\n");
 	vsb_cat(sb, "void VRT_l_req_esi(struct sess *, unsigned);\n");
@@ -357,7 +355,8 @@
 	vsb_cat(sb, "(struct sess *, double);\nconst char * VRT_r_beresp_pr");
 	vsb_cat(sb, "oto(const struct sess *);\nvoid VRT_l_beresp_proto(con");
 	vsb_cat(sb, "st struct sess *, const char *, ...);\n");
-	vsb_cat(sb, "int VRT_r_beresp_status(const struct sess *);\n");
+	vsb_cat(sb, "void VRT_l_beresp_saintmode(const struct sess *, doubl");
+	vsb_cat(sb, "e);\nint VRT_r_beresp_status(const struct sess *);\n");
 	vsb_cat(sb, "void VRT_l_beresp_status(const struct sess *, int);\n");
 	vsb_cat(sb, "const char * VRT_r_beresp_response(const struct sess *");
 	vsb_cat(sb, ");\nvoid VRT_l_beresp_response(const struct sess *, co");

Modified: trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl	2009-08-24 14:51:26 UTC (rev 4208)
@@ -219,6 +219,11 @@
 	{ fetch }
 	"const struct sess *"
     }
+    { beresp.saintmode			TIME
+    	WO
+	{ fetch }
+	"const struct sess *"
+    }
     { beresp.status			INT
 	RW
 	{ fetch }

Modified: trunk/varnish-cache/lib/libvcl/vcc_obj.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_obj.c	2009-08-20 12:11:47 UTC (rev 4207)
+++ trunk/varnish-cache/lib/libvcl/vcc_obj.c	2009-08-24 14:51:26 UTC (rev 4208)
@@ -1,5 +1,5 @@
 /*
- * $Id: vcc_gen_fixed_token.tcl 4188 2009-08-18 08:29:27Z phk $
+ * $Id$
  *
  * NB:  This file is machine generated, DO NOT EDIT!
  *
@@ -159,6 +159,11 @@
 	    V_RW,	    0,
 	    VCL_MET_FETCH
 	},
+	{ "beresp.saintmode", TIME, 16,
+	    NULL,	    "VRT_l_beresp_saintmode(sp, ",
+	    V_WO,	    0,
+	    VCL_MET_FETCH
+	},
 	{ "beresp.status", INT, 13,
 	    "VRT_r_beresp_status(sp)",	    "VRT_l_beresp_status(sp, ",
 	    V_RW,	    0,



More information about the varnish-commit mailing list