[master] a6277de Shift the 503 creation into the error step.

Poul-Henning Kamp phk at FreeBSD.org
Tue Feb 25 12:33:25 CET 2014


commit a6277de361e1d17b5aabb0fd36baf705b2e418f4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Feb 18 14:13:27 2014 +0000

    Shift the 503 creation into the error step.

diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index f044347..51cb160 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -41,21 +41,6 @@
 #include "vcl.h"
 #include "vtim.h"
 
-/*--------------------------------------------------------------------
- */
-
-static void
-make_it_503(struct busyobj *bo)
-{
-
-	HTTP_Setup(bo->beresp, bo->ws, bo->vsl, SLT_BerespMethod);
-	http_SetResp(bo->beresp, "HTTP/1.1", 503, "Backend fetch failed");
-	http_SetHeader(bo->beresp, "Content-Length: 0");
-	http_SetHeader(bo->beresp, "Connection: close");
-	bo->exp.ttl = 0;
-	bo->exp.grace = 0;
-	bo->exp.keep = 0;
-}
 
 /*--------------------------------------------------------------------
  */
@@ -298,7 +283,7 @@ vbf_stp_startfetch(struct worker *wrk, struct busyobj *bo)
 static enum fetch_step
 vbf_stp_fetchhdr(struct worker *wrk, struct busyobj *bo)
 {
-	int i, do_ims, fail;
+	int i, do_ims;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
@@ -330,14 +315,11 @@ vbf_stp_fetchhdr(struct worker *wrk, struct busyobj *bo)
 
 	if (i) {
 		AZ(bo->vbc);
-		make_it_503(bo);
-		fail = 1;
-	} else {
-		AN(bo->vbc);
-		http_VSL_log(bo->beresp);
-		fail = 0;
-	}
+		return (F_STP_ERROR);
+	} 
 
+	AN(bo->vbc);
+	http_VSL_log(bo->beresp);
 
 	/*
 	 * These two headers can be spread over multiple actual headers
@@ -353,8 +335,6 @@ vbf_stp_fetchhdr(struct worker *wrk, struct busyobj *bo)
 	 * NB: Also sets other wrk variables
 	 */
 	bo->htc.body_status = RFC2616_Body(bo, &wrk->stats);
-	if (i && bo->htc.body_status == BS_LENGTH)
-		bo->htc.body_status = BS_NONE;
 
 	bo->err_code = http_GetStatus(bo->beresp);
 
@@ -381,22 +361,18 @@ vbf_stp_fetchhdr(struct worker *wrk, struct busyobj *bo)
 	VCL_backend_response_method(bo->vcl, wrk, NULL, bo, bo->beresp->ws);
 
 	if (wrk->handling == VCL_RET_RETRY) {
-		if (bo->vbc)
-			VDI_CloseFd(&bo->vbc);
+		AN (bo->vbc);
+		VDI_CloseFd(&bo->vbc);
 		bo->retries++;
 		if (bo->retries <= cache_param->max_retries)
 			return (F_STP_RETRY);
-
 		VSLb(bo->vsl, SLT_VCL_Error,
 		    "Too many retries, delivering 503");
-		make_it_503(bo);
-		wrk->handling = VCL_RET_DELIVER;
+		return (F_STP_ERROR);
 	}
 
 	assert(bo->state == BOS_REQ_DONE);
 	VBO_setstate(bo, BOS_COMMITTED);
-	if (fail)
-		(void)VFP_Error(bo, "Fetch failed");
 
 	if (bo->do_esi)
 		bo->do_stream = 0;
@@ -414,7 +390,7 @@ static enum fetch_step
 vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
 {
 	struct object *obj;
-	ssize_t est = -1;
+	ssize_t est;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
@@ -465,8 +441,8 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
 	/* But we can't do both at the same time */
 	assert(bo->do_gzip == 0 || bo->do_gunzip == 0);
 
-	if (bo->vbc != NULL)
-		est = V1F_Setup_Fetch(bo);
+	AN(bo->vbc);
+	est = V1F_Setup_Fetch(bo);
 
 	if (bo->do_gunzip || (bo->is_gzip && bo->do_esi)) {
 		RFC2616_Weaken_Etag(bo->beresp);
@@ -715,7 +691,21 @@ vbf_stp_error(struct worker *wrk, struct busyobj *bo)
 
 	xxxassert(wrk->handling == VCL_RET_DELIVER);
 
-	WRONG("");
+	http_PrintfHeader(bo->beresp, "Content-Length: %jd", (intmax_t)0);
+	http_PrintfHeader(bo->beresp, "X-XXXPHK: yes");
+
+	if (vbf_bereq2obj(wrk, bo)) {
+		INCOMPL();
+	}
+
+	HSH_Unbusy(&wrk->stats, bo->fetch_obj->objcore);
+
+	if (!(bo->fetch_obj->objcore->flags & OC_F_PRIVATE)) {
+		EXP_Insert(bo->fetch_obj->objcore);
+		AN(bo->fetch_obj->objcore->ban);
+	}
+	VBO_setstate(bo, BOS_FINISHED);
+	HSH_Complete(bo->fetch_obj->objcore);
 	return (F_STP_DONE);
 }
 
diff --git a/bin/varnishtest/tests/b00015.vtc b/bin/varnishtest/tests/b00015.vtc
index 9905e96..029f782 100644
--- a/bin/varnishtest/tests/b00015.vtc
+++ b/bin/varnishtest/tests/b00015.vtc
@@ -21,7 +21,7 @@ client c1 {
 	txreq -url "/"
 	rxresp
 	expect resp.status == 503
-	expect resp.http.X-varnish == "1005"
+	expect resp.http.X-varnish == "1004"
 } -run
 
 delay .1
@@ -46,7 +46,7 @@ client c1 {
 	txreq -url "/"
 	rxresp
 	expect resp.status == 302
-	expect resp.http.X-varnish == "1009"
+	expect resp.http.X-varnish == "1007"
 } -run
 
 delay .1
@@ -55,7 +55,7 @@ client c1 {
 	txreq -url "/"
 	rxresp
 	expect resp.status == 302
-	expect resp.http.X-varnish == "1012 1010"
+	expect resp.http.X-varnish == "1010 1008"
 } -run
 
 delay .1
@@ -79,7 +79,7 @@ client c1 {
 	txreq -url "/2"
 	rxresp
 	expect resp.status == 502
-	expect resp.http.X-varnish == "1014"
+	expect resp.http.X-varnish == "1012"
 } -run
 
 delay .1
@@ -88,7 +88,7 @@ client c1 {
 	txreq -url "/2"
 	rxresp
 	expect resp.status == 502
-	expect resp.http.X-varnish == "1017 1015"
+	expect resp.http.X-varnish == "1015 1013"
 } -run
 
 delay .1
diff --git a/bin/varnishtest/tests/r01395.vtc b/bin/varnishtest/tests/r01395.vtc
index c3243f6..acad0fe 100644
--- a/bin/varnishtest/tests/r01395.vtc
+++ b/bin/varnishtest/tests/r01395.vtc
@@ -5,8 +5,8 @@ varnish v1 -vcl {
 		.host = "${bad_ip}"; .port = "9090";
 	}
 
-	sub vcl_error {
-		set obj.status = 299;
+	sub vcl_backend_error {
+		set beresp.status = 299;
 	}
 } -start
 



More information about the varnish-commit mailing list