[experimental-ims] 501af0b Add a bo->state that tells us what's going on. Improve error reporting at the same time.

Poul-Henning Kamp phk at FreeBSD.org
Thu Dec 18 10:27:40 CET 2014


commit 501af0ba839629de342a2c17963bb04de8599625
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Mar 5 12:12:37 2012 +0000

    Add a bo->state that tells us what's going on.
    Improve error reporting at the same time.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index dceac39..bea32a2 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -449,6 +449,13 @@ oc_getlru(const struct objcore *oc)
  * streaming delivery will make use of.
  */
 
+enum busyobj_state_e {
+	BOS_INVALID = 0,
+	BOS_FETCHING,
+	BOS_FAILED,
+	BOS_FINISHED
+};
+
 struct busyobj {
 	unsigned		magic;
 #define BUSYOBJ_MAGIC		0x23b95567
@@ -460,7 +467,7 @@ struct busyobj {
 
 	struct vfp		*vfp;
 	struct vep_state	*vep;
-	unsigned		fetch_failed;
+	enum busyobj_state_e	state;
 	struct vgz		*vgz_rx;
 
 	struct ws		ws[1];
diff --git a/bin/varnishd/cache/cache_esi_fetch.c b/bin/varnishd/cache/cache_esi_fetch.c
index ffb90f8..6699117 100644
--- a/bin/varnishd/cache/cache_esi_fetch.c
+++ b/bin/varnishd/cache/cache_esi_fetch.c
@@ -366,12 +366,13 @@ vfp_esi_end(struct busyobj *bo)
 	struct vsb *vsb;
 	struct vef_priv *vef;
 	ssize_t l;
-	int retval;
+	int retval = 0;
 
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	AN(bo->vep);
 
-	retval = bo->fetch_failed;
+	if (bo->state == BOS_FAILED)
+		retval = -1;
 
 	if (bo->vgz_rx != NULL && VGZ_Destroy(&bo->vgz_rx) != VGZ_END)
 		retval = FetchError(bo, "Gunzip+ESI Failed at the very end");
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 1f146d0..fd70d07 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -56,13 +56,13 @@ FetchError2(struct busyobj *bo, const char *error, const char *more)
 {
 
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
-	if (!bo->fetch_failed) {
+	if (bo->state == BOS_FETCHING) {
 		if (more == NULL)
 			VSLb(bo->vsl, SLT_FetchError, "%s", error);
 		else
 			VSLb(bo->vsl, SLT_FetchError, "%s: %s", error, more);
 	}
-	bo->fetch_failed = 1;
+	bo->state = BOS_FAILED;
 	return (-1);
 }
 
@@ -83,7 +83,7 @@ VFP_Begin(struct busyobj *bo, size_t estimate)
 	AN(bo->vfp);
 
 	bo->vfp->begin(bo, estimate);
-	if (bo->fetch_failed)
+	if (bo->state == BOS_FAILED)
 		return (-1);
 	return (0);
 }
@@ -94,7 +94,7 @@ VFP_Bytes(struct busyobj *bo, struct http_conn *htc, ssize_t sz)
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	AN(bo->vfp);
 	CHECK_OBJ_NOTNULL(htc, HTTP_CONN_MAGIC);
-	AZ(bo->fetch_failed);
+	assert(bo->state == BOS_FETCHING);
 
 	return (bo->vfp->bytes(bo, htc, sz));
 }
@@ -102,10 +102,16 @@ VFP_Bytes(struct busyobj *bo, struct http_conn *htc, ssize_t sz)
 static int
 VFP_End(struct busyobj *bo)
 {
+	int i;
+
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	AN(bo->vfp);
 
-	return (bo->vfp->end(bo));
+	i = bo->vfp->end(bo);
+	if (i)
+		assert(bo->state == BOS_FAILED);
+	return (i);
+
 }
 
 
@@ -295,8 +301,8 @@ fetch_chunked(struct busyobj *bo, struct http_conn *htc)
 	do {
 		/* Skip leading whitespace */
 		do {
-			if (HTC_Read(htc, buf, 1) <= 0)
-				return (-1);
+			if (HTC_Read(htc, buf, 1) <= 0) 
+				return (FetchError(bo, "chunked read err"));
 		} while (vct_islws(buf[0]));
 
 		if (!vct_ishex(buf[0]))
@@ -306,7 +312,8 @@ fetch_chunked(struct busyobj *bo, struct http_conn *htc)
 		for (u = 1; u < sizeof buf; u++) {
 			do {
 				if (HTC_Read(htc, buf + u, 1) <= 0)
-					return (-1);
+					return (FetchError(bo,
+					    "chunked read err"));
 			} while (u == 1 && buf[0] == '0' && buf[u] == '0');
 			if (!vct_ishex(buf[u]))
 				break;
@@ -318,7 +325,7 @@ fetch_chunked(struct busyobj *bo, struct http_conn *htc)
 		/* Skip trailing white space */
 		while(vct_islws(buf[u]) && buf[u] != '\n')
 			if (HTC_Read(htc, buf + u, 1) <= 0)
-				return (-1);
+				return (FetchError(bo, "chunked read err"));
 
 		if (buf[u] != '\n')
 			return (FetchError(bo,"chunked header no NL"));
@@ -329,13 +336,13 @@ fetch_chunked(struct busyobj *bo, struct http_conn *htc)
 			return (FetchError(bo,"chunked header number syntax"));
 
 		if (cl > 0 && VFP_Bytes(bo, htc, cl) <= 0)
-			return (-1);
+			return (FetchError(bo, "chunked read err"));
 
 		i = HTC_Read(htc, buf, 1);
 		if (i <= 0)
-			return (-1);
+			return (FetchError(bo, "chunked read err"));
 		if (buf[0] == '\r' && HTC_Read( htc, buf, 1) <= 0)
-			return (-1);
+			return (FetchError(bo, "chunked read err"));
 		if (buf[0] != '\n')
 			return (FetchError(bo,"chunked tail no NL"));
 	} while (cl > 0);
@@ -352,7 +359,7 @@ fetch_eof(struct busyobj *bo, struct http_conn *htc)
 	assert(bo->body_status == BS_EOF);
 	i = VFP_Bytes(bo, htc, SSIZE_MAX);
 	if (i < 0)
-		return (-1);
+		return (FetchError(bo,"eof socket fail"));
 	return (0);
 }
 
@@ -545,6 +552,9 @@ FetchBody(struct worker *wrk, struct busyobj *bo)
 	CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
 	CHECK_OBJ_NOTNULL(obj->http, HTTP_MAGIC);
 
+	assert(bo->state == BOS_INVALID);
+	bo->state = BOS_FINISHED;
+
 	/*
 	 * XXX: The busyobj needs a dstat, but it is not obvious which one
 	 * XXX: it should be (own/borrowed).  For now borrow the wrk's.
@@ -562,7 +572,7 @@ FetchBody(struct worker *wrk, struct busyobj *bo)
 	AZ(bo->vgz_rx);
 	AZ(VTAILQ_FIRST(&obj->store));
 
-	bo->fetch_failed = 0;
+	bo->state = BOS_FETCHING;
 
 	/* XXX: pick up estimate from objdr ? */
 	cl = 0;
@@ -628,13 +638,14 @@ FetchBody(struct worker *wrk, struct busyobj *bo)
 	}
 
 	if (cls < 0) {
+		assert(bo->state == BOS_FAILED);
 		wrk->stats.fetch_failed++;
 		VDI_CloseFd(&bo->vbc);
 		obj->len = 0;
 		bo->stats = NULL;
 		return (__LINE__);
 	}
-	AZ(bo->fetch_failed);
+	assert(bo->state == BOS_FETCHING);
 
 	if (cls == 0 && bo->should_close)
 		cls = 1;
@@ -661,6 +672,8 @@ FetchBody(struct worker *wrk, struct busyobj *bo)
 		http_PrintfHeader(obj->http, "Content-Length: %zd", obj->len);
 	}
 
+	bo->state = BOS_FINISHED;
+
 	if (cls)
 		VDI_CloseFd(&bo->vbc);
 	else
diff --git a/bin/varnishd/cache/cache_gzip.c b/bin/varnishd/cache/cache_gzip.c
index e2b4d51..343bd35 100644
--- a/bin/varnishd/cache/cache_gzip.c
+++ b/bin/varnishd/cache/cache_gzip.c
@@ -483,7 +483,7 @@ vfp_gunzip_end(struct busyobj *bo)
 	vg = bo->vgz_rx;
 	bo->vgz_rx = NULL;
 	CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
-	if (bo->fetch_failed) {
+	if (bo->state == BOS_FAILED) {
 		(void)VGZ_Destroy(&vg);
 		return(0);
 	}
@@ -560,7 +560,7 @@ vfp_gzip_end(struct busyobj *bo)
 	vg = bo->vgz_rx;
 	CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
 	bo->vgz_rx = NULL;
-	if (bo->fetch_failed) {
+	if (bo->state == BOS_FAILED) {
 		(void)VGZ_Destroy(&vg);
 		return(0);
 	}
@@ -652,7 +652,7 @@ vfp_testgzip_end(struct busyobj *bo)
 	vg = bo->vgz_rx;
 	bo->vgz_rx = NULL;
 	CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
-	if (bo->fetch_failed) {
+	if (bo->state == BOS_FAILED) {
 		(void)VGZ_Destroy(&vg);
 		return(0);
 	}



More information about the varnish-commit mailing list