
phk at varnish-cache
May 4, 2012, 1:03 AM
Views: 57
Permalink
|
|
[master] 31ffe7c Make cnt_prepresp run on incomplete busyobj
|
|
commit 31ffe7ccab8e4b0b226dbe950f3fbf87e6d16852 Author: Poul-Henning Kamp <phk [at] FreeBSD> Date: Fri May 4 08:02:56 2012 +0000 Make cnt_prepresp run on incomplete busyobj diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c index cce170c..a95df05 100644 --- a/bin/varnishd/cache/cache_center.c +++ b/bin/varnishd/cache/cache_center.c @@ -278,8 +278,8 @@ cnt_prepresp(struct sess *sp, struct worker *wrk, struct req *req) break; if (bo != NULL) { AN(bo->do_stream); - HSH_Drop(wrk, &sp->req->obj); - VBO_DerefBusyObj(wrk, &bo); + (void)HSH_Deref(&wrk->stats, NULL, &req->obj); + VBO_DerefBusyObj(wrk, &req->busyobj); } else { (void)HSH_Deref(&wrk->stats, NULL, &req->obj); } @@ -312,10 +312,29 @@ DOT deliver -> DONE [style=bold,color=blue] static int cnt_deliver(struct sess *sp, struct worker *wrk, struct req *req) { + struct busyobj *bo; + CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC); + bo = req->busyobj; + CHECK_OBJ_ORNULL(bo, BUSYOBJ_MAGIC); + + if (bo != NULL) { + while (bo->state < BOS_FAILED) + (void)usleep(10000); + assert(bo->state >= BOS_FAILED); + + if (bo->state == BOS_FAILED) { + req->obj = NULL; + VBO_DerefBusyObj(wrk, &req->busyobj); + req->err_code = 503; + sp->step = STP_ERROR; + return (0); + } + VBO_DerefBusyObj(wrk, &req->busyobj); + } AZ(req->busyobj); req->director = NULL; @@ -879,13 +898,13 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req) Pool_Task(wrk->pool, &bo->fetch_task, POOL_NO_QUEUE)) FetchBody(wrk, bo); - while (bo->state < BOS_FAILED) - (void)usleep(10000); - assert(bo->state >= BOS_FAILED); - - assert(WRW_IsReleased(wrk)); + if (req->obj->objcore != NULL) + HSH_Ref(req->obj->objcore); - if (bo->state == BOS_FAILED) { + if (bo->state > BOS_FAILED) { + VBO_DerefBusyObj(wrk, &req->busyobj); + } else if (bo->state == BOS_FAILED) { + /* handle early failures */ req->obj = NULL; VBO_DerefBusyObj(wrk, &req->busyobj); req->err_code = 503; @@ -893,10 +912,7 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req) return (0); } - if (req->obj->objcore != NULL) - HSH_Ref(req->obj->objcore); - - VBO_DerefBusyObj(wrk, &req->busyobj); + assert(WRW_IsReleased(wrk)); sp->step = STP_PREPRESP; return (0); } _______________________________________________ varnish-commit mailing list varnish-commit [at] varnish-cache https://www.varnish-cache.org/lists/mailman/listinfo/varnish-commit
|