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