r2067 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Sun Sep 30 22:57:30 CEST 2007


Author: phk
Date: 2007-09-30 22:57:30 +0200 (Sun, 30 Sep 2007)
New Revision: 2067

Modified:
   trunk/varnish-cache/bin/varnishd/cache.h
   trunk/varnish-cache/bin/varnishd/cache_center.c
   trunk/varnish-cache/bin/varnishd/cache_hash.c
   trunk/varnish-cache/bin/varnishd/cache_vrt.c
Log:
Add the first stab at a "restart" mechanism.

The intent is to be able to do things like:

	backend b1 {
		set backend.host = "fs.freebsd.dk";
		set backend.port = "82";
	}
	backend b2 {
		set backend.host = "fs.freebsd.dk";
		set backend.port = "81";
	}
	backend b3 {
		set backend.host = "fs.freebsd.dk";
		set backend.port = "80";
	}

	sub vcl_recv {
		remove req.http.cookie;
		if (req.restarts == 0) {
			set req.backend = b1;
		} else if (req.restarts == 1) {
			set req.backend = b2;
		} else {
			set req.backend = b3;
		}
	}

	sub vcl_fetch {
		if (obj.status != 200) {
			restart;
		}
	}




Modified: trunk/varnish-cache/bin/varnishd/cache.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache.h	2007-09-30 20:38:15 UTC (rev 2066)
+++ trunk/varnish-cache/bin/varnishd/cache.h	2007-09-30 20:57:30 UTC (rev 2067)
@@ -278,6 +278,8 @@
 	int			id;
 	unsigned		xid;
 
+	int			restarts;
+
 	struct worker		*wrk;
 
 	socklen_t		sockaddrlen;

Modified: trunk/varnish-cache/bin/varnishd/cache_center.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_center.c	2007-09-30 20:38:15 UTC (rev 2066)
+++ trunk/varnish-cache/bin/varnishd/cache_center.c	2007-09-30 20:57:30 UTC (rev 2067)
@@ -303,21 +303,30 @@
 	VBE_free_bereq(sp->bereq);
 	sp->bereq = NULL;
 
-	if (i) {
+	if (0 && i) {
 		SYN_ErrorPage(sp, 503, "Error talking to backend", 30);
 	} else {
-		RFC2616_cache_policy(sp, &sp->obj->http);	/* XXX -> VCL */
+		if (!i)
+			RFC2616_cache_policy(sp, &sp->obj->http);	/* XXX -> VCL */
+		else
+			sp->obj->http.status = 503;
 
 		VCL_fetch_method(sp);
 
 		switch (sp->handling) {
 		case VCL_RET_ERROR:
+		case VCL_RET_RESTART:
 			sp->obj->ttl = 0;
 			sp->obj->cacheable = 0;
 			HSH_Unbusy(sp->obj);
 			HSH_Deref(sp->obj);
 			sp->obj = NULL;
-			sp->step = STP_ERROR;
+			if (sp->handling == VCL_RET_ERROR)
+				sp->step = STP_ERROR;
+			else {
+				sp->restarts++;
+				sp->step = STP_RECV;
+			}
 			return (0);
 		case VCL_RET_PASS:
 			sp->obj->pass = 1;
@@ -696,39 +705,41 @@
 {
 	int done;
 
-	AZ(sp->vcl);
 	AZ(sp->obj);
 
-	/* Update stats of various sorts */
-	VSL_stats->client_req++;			/* XXX not locked */
-	sp->t_req = TIM_real();
-	sp->wrk->used = sp->t_req;
-	sp->wrk->acct.req++;
+	if (sp->restarts == 0) {
+		AZ(sp->vcl);
+		/* Update stats of various sorts */
+		VSL_stats->client_req++;			/* XXX not locked */
+		sp->t_req = TIM_real();
+		sp->wrk->used = sp->t_req;
+		sp->wrk->acct.req++;
 
-	/* Assign XID and log */
-	sp->xid = ++xids;				/* XXX not locked */
-	WSP(sp, SLT_ReqStart, "%s %s %u", sp->addr, sp->port,  sp->xid);
+		/* Assign XID and log */
+		sp->xid = ++xids;				/* XXX not locked */
+		WSP(sp, SLT_ReqStart, "%s %s %u", sp->addr, sp->port,  sp->xid);
 
-	/* Borrow VCL reference from worker thread */
-	VCL_Refresh(&sp->wrk->vcl);
-	sp->vcl = sp->wrk->vcl;
-	sp->wrk->vcl = NULL;
+		/* Borrow VCL reference from worker thread */
+		VCL_Refresh(&sp->wrk->vcl);
+		sp->vcl = sp->wrk->vcl;
+		sp->wrk->vcl = NULL;
 
-	done = http_DissectRequest(sp);
-	if (done != 0) {
-		RES_Error(sp, done, NULL);		/* XXX: STP_ERROR ? */
-		sp->step = STP_DONE;
-		return (0);
-	}
+		done = http_DissectRequest(sp);
+		if (done != 0) {
+			RES_Error(sp, done, NULL);		/* XXX: STP_ERROR ? */
+			sp->step = STP_DONE;
+			return (0);
+		}
 
-	sp->doclose = http_DoConnection(sp->http);
+		sp->doclose = http_DoConnection(sp->http);
 
-	/* By default we use the first backend */
-	AZ(sp->backend);
-	sp->backend = sp->vcl->backend[0];
-	CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC);
+		/* By default we use the first backend */
+		AZ(sp->backend);
+		sp->backend = sp->vcl->backend[0];
+		CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC);
 
-	/* XXX: Handle TRACE & OPTIONS of Max-Forwards = 0 */
+		/* XXX: Handle TRACE & OPTIONS of Max-Forwards = 0 */
+	}
 
 	VCL_recv_method(sp);
 

Modified: trunk/varnish-cache/bin/varnishd/cache_hash.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_hash.c	2007-09-30 20:38:15 UTC (rev 2066)
+++ trunk/varnish-cache/bin/varnishd/cache_hash.c	2007-09-30 20:57:30 UTC (rev 2067)
@@ -304,7 +304,7 @@
 	if (r != 0)
 		return;
 
-	if (o->http.ws->s != NULL)
+	if (o->http.ws != NULL && o->http.ws->s != NULL)
 		free(o->http.ws->s);
 
 	if (o->vary != NULL)

Modified: trunk/varnish-cache/bin/varnishd/cache_vrt.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_vrt.c	2007-09-30 20:38:15 UTC (rev 2066)
+++ trunk/varnish-cache/bin/varnishd/cache_vrt.c	2007-09-30 20:57:30 UTC (rev 2067)
@@ -239,6 +239,9 @@
 {
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 	CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC);
+	/* XXX: use http_GetStatus() */
+	if (sp->obj->http.status)
+		return (sp->obj->http.status);
 	return (atoi(sp->obj->http.hd[HTTP_HDR_STATUS].b));
 }
 
@@ -356,6 +359,16 @@
 
 /*--------------------------------------------------------------------*/
 
+int
+VRT_r_req_restarts(const struct sess *sp)
+{
+
+	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	return (sp->restarts);
+}
+
+/*--------------------------------------------------------------------*/
+
 const char *
 VRT_r_resp_proto(const struct sess *sp)
 {




More information about the varnish-commit mailing list