]> err.no Git - varnish/commitdiff
Deal with backend connection errors while fetching the body.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Mon, 18 Sep 2006 19:38:35 +0000 (19:38 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Mon, 18 Sep 2006 19:38:35 +0000 (19:38 +0000)
Eventually, VCL should get a say in this.

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1079 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache_center.c
varnish-cache/bin/varnishd/cache_fetch.c

index 04365f5606b067d8e4539c00babaec8b2911319d..482fd4e0a35bb3ec4129b48328212fca0a712ff2 100644 (file)
@@ -280,8 +280,16 @@ cnt_fetch(struct sess *sp)
                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);
index 2b167924be3fc631099f50007d0be230e9412d2b..b8752c5088ad59e324c8cd951367f8ec6e87a3c5 100644 (file)
@@ -45,7 +45,8 @@ fetch_straight(const struct sess *sp, int fd, struct http *hp, char *b)
 
        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 @@ fetch_chunked(const struct sess *sp, int fd, struct http *hp)
                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 @@ fetch_chunked(const struct sess *sp, int fd, struct http *hp)
                        /* 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 @@ fetch_eof(const struct sess *sp, int fd, struct http *hp)
                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 @@ FetchBody(struct sess *sp)
        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 @@ FetchBody(struct sess *sp)
        } 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;