r1079 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Mon Sep 18 21:38:35 CEST 2006


Author: phk
Date: 2006-09-18 21:38:35 +0200 (Mon, 18 Sep 2006)
New Revision: 1079

Modified:
   trunk/varnish-cache/bin/varnishd/cache_center.c
   trunk/varnish-cache/bin/varnishd/cache_fetch.c
Log:
Deal with backend connection errors while fetching the body.

Eventually, VCL should get a say in this.



Modified: trunk/varnish-cache/bin/varnishd/cache_center.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_center.c	2006-09-18 18:49:46 UTC (rev 1078)
+++ trunk/varnish-cache/bin/varnishd/cache_center.c	2006-09-18 19:38:35 UTC (rev 1079)
@@ -280,8 +280,16 @@
 		return (0);
 	}
 	if (sp->handling == VCL_RET_INSERT) {
+		if (FetchBody(sp)) {
+			sp->obj->cacheable = 0;
+			HSH_Unbusy(sp->obj);
+			HSH_Deref(sp->obj);
+			sp->obj = NULL;
+			RES_Error(sp, 503, NULL);
+			sp->step = STP_DONE;
+			return (0);
+		}
 		sp->obj->cacheable = 1;
-		FetchBody(sp);
 		AZ(sp->vbc);
 		HSH_Ref(sp->obj); /* get another, STP_DELIVER will deref */
 		HSH_Unbusy(sp->obj);

Modified: trunk/varnish-cache/bin/varnishd/cache_fetch.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_fetch.c	2006-09-18 18:49:46 UTC (rev 1078)
+++ trunk/varnish-cache/bin/varnishd/cache_fetch.c	2006-09-18 19:38:35 UTC (rev 1079)
@@ -45,7 +45,8 @@
 
 	while (cl > 0) {
 		i = http_Read(hp, fd, p, cl);
-		xxxassert(i > 0);	/* XXX seen */
+		if (i <= 0)
+			return (-1);
 		p += i;
 		cl -= i;
 	}
@@ -86,7 +87,8 @@
 		if (q == NULL || q == buf || *q != '\n') {
 			xxxassert(be > bp);
 			i = http_Read(hp, fd, bp, be - bp);
-			xxxassert(i >= 0);
+			if (i <= 0)
+				return (-1);
 			bp += i;
 			continue;
 		}
@@ -135,6 +137,8 @@
 			/* Pick up the rest of this chunk */
 			while (v > 0) {
 				i = http_Read(hp, fd, st->ptr + st->len, v);
+				if (i <= 0)
+					return (-1);
 				st->len += i;
 				sp->obj->len += i;
 				u -= i;
@@ -190,9 +194,10 @@
 		AN(p);
 		AN(st);
 		i = http_Read(hp, fd, p, v);
-		xxxassert(i >= 0);
+		if (i < 0)
+			return (-1);
 		if (i == 0)
-		     break;
+			break;
 		p += i;
 		v -= i;
 		st->len += i;
@@ -218,6 +223,7 @@
 	char *b;
 	int body = 1;		/* XXX */
 	struct http *hp;
+	struct storage *st;
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 	CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC);
@@ -248,9 +254,19 @@
 	} else
 		cls = 0;
 
+	if (cls < 0) {
+		while (!TAILQ_EMPTY(&sp->obj->store)) {
+			st = TAILQ_FIRST(&sp->obj->store);
+			TAILQ_REMOVE(&sp->obj->store, st, list);
+			stevedore->free(st);
+		}
+		close(vc->fd);
+		VBE_ClosedFd(sp->wrk, vc, 1);
+		return (-1);
+	}
+
 	{
 	/* Sanity check fetch methods accounting */
-		struct storage *st;
 		unsigned uu;
 
 		uu = 0;




More information about the varnish-commit mailing list