[master] a6fafd2 One comment and N > 0 bugs from goal...

Poul-Henning Kamp phk at varnish-cache.org
Fri May 24 16:24:23 CEST 2013


commit a6fafd240e6e25f67d52a453551e43a449d532a4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri May 24 14:24:04 2013 +0000

    One comment and N > 0 bugs from goal...

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 82dc709..77ef0d5 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -814,7 +814,7 @@ int EXP_NukeOne(struct busyobj *, struct lru *lru);
 void EXP_NukeLRU(struct worker *wrk, struct vsl_log *vsl, struct lru *lru);
 
 /* cache_fetch.c */
-int VBF_Fetch(struct worker *wrk, struct req *req);
+void VBF_Fetch(struct worker *wrk, struct req *req);
 struct storage *VBF_GetStorage(struct busyobj *, ssize_t sz);
 int VBF_Error(struct busyobj *, const char *error);
 int VBF_Error2(struct busyobj *, const char *error, const char *more);
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 143a929..0aa85fe 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -772,38 +772,49 @@ vbf_proc_resp(struct worker *wrk, struct busyobj *bo)
 
 }
 
-int
-VBF_Fetch(struct worker *wrk, struct req *req)
+struct vbf_secret_handshake {
+	unsigned		magic;
+#define VBF_SECRET_HANDSHAKE_MAGIC	0x98c95172
+	struct busyobj		*bo;
+	struct req		**reqp;
+};
+
+static void
+vbf_fetch_thread(struct worker *wrk, void *priv)
 {
+	struct vbf_secret_handshake *vsh;
+	struct busyobj *bo;
+	struct req *req;
+	int i;
 	struct http *hp, *hp2;
 	char *b;
 	uint16_t nhttp;
 	unsigned l;
 	struct vsb *vary = NULL;
 	int varyl = 0;
-	struct busyobj *bo;
 	struct object *obj;
-	int i;
+
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CAST_OBJ_NOTNULL(vsh, priv, VBF_SECRET_HANDSHAKE_MAGIC);
+	AN(vsh->reqp);
+	req = *vsh->reqp;
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
-	CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
 
-	bo = req->busyobj;
-	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
-	assert(bo->refcount == 2);
-	CHECK_OBJ_NOTNULL(bo->vcl, VCL_CONF_MAGIC);
-
-	bo->fetch_objcore = req->objcore;
-	req->objcore = NULL;
+	bo = vsh->bo;
 
 	vbf_make_bereq(wrk, req, bo);
 	xxxassert (wrk->handling == VCL_RET_FETCH);
 
 	HTTP_Setup(bo->beresp, bo->ws, bo->vsl, HTTP_Beresp);
 
-	if (!bo->do_pass)
+	if (!bo->do_pass) {
+		AN(req);
+		AN(vsh);
 		req = NULL;
+		*vsh->reqp = NULL;
+		vsh = NULL;
+	}
 
 	i = vbf_fetch_hdr(wrk, bo, req);
 	/*
@@ -816,9 +827,15 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 		i = vbf_fetch_hdr(wrk, bo, req);
 	}
 
-	if (bo->do_pass)
+	if (bo->do_pass) {
+		AN(req);
+		AN(vsh);
 		req = NULL;
+		*vsh->reqp = NULL;
+		vsh = NULL;
+	}
 	AZ(req);
+	AZ(vsh);
 
 	if (i) {
 		wrk->handling = VCL_RET_ERROR;
@@ -843,11 +860,12 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 		assert(bo->refcount == 2);
 		bo->storage_hint = NULL;
 		bo->director = NULL;
-		VBO_DerefBusyObj(wrk, &bo);
 
 		switch (wrk->handling) {
 		case VCL_RET_ERROR:
-			return (-1);
+			bo->state = BOS_FAILED;
+			VBO_DerefBusyObj(wrk, &bo);
+			return;
 		case VCL_RET_RESTART:
 			INCOMPL();
 		default:
@@ -878,7 +896,8 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 			AZ(HSH_Deref(&wrk->stats, bo->fetch_objcore, NULL));
 			bo->fetch_objcore = NULL;
 			VDI_CloseFd(&bo->vbc);
-			return (-1);
+			bo->state = BOS_FAILED;
+			return;
 		} else
 			/* No vary */
 			AZ(vary);
@@ -912,7 +931,8 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 		AZ(HSH_Deref(&wrk->stats, bo->fetch_objcore, NULL));
 		bo->fetch_objcore = NULL;
 		VDI_CloseFd(&bo->vbc);
-		return (-1);
+		bo->state = BOS_FAILED;
+		return;
 	}
 	CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
 
@@ -974,11 +994,43 @@ VBF_Fetch(struct worker *wrk, struct req *req)
 	if (bo->state == BOS_FAILED) {
 		/* handle early failures */
 		(void)HSH_Deref(&wrk->stats, NULL, &obj);
-		return (-1);
+		return;
 	}
 
 	assert(WRW_IsReleased(wrk));
-	return (0);
+}
+
+void
+VBF_Fetch(struct worker *wrk, struct req *req)
+{
+	struct vbf_secret_handshake vsh;
+	struct busyobj *bo;
+
+	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+	CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
+
+	bo = req->busyobj;
+	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+	assert(bo->refcount == 2);
+	CHECK_OBJ_NOTNULL(bo->vcl, VCL_CONF_MAGIC);
+
+	bo->fetch_objcore = req->objcore;
+	req->objcore = NULL;
+
+	vsh.magic = VBF_SECRET_HANDSHAKE_MAGIC;
+	vsh.bo = bo;
+	vsh.reqp = &req;
+
+	bo->fetch_task.priv = &vsh;
+	bo->fetch_task.func = vbf_fetch_thread;
+
+	// if (Pool_Task(wrk->pool, &bo->fetch_task, POOL_QUEUE_FRONT))
+		vbf_fetch_thread(wrk, &vsh);
+	while (req != NULL) {
+		printf("XXX\n");
+		(void)usleep(100000);
+	}
 }
 
 /*--------------------------------------------------------------------
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 1e55fcd..5ee6d14 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -351,7 +351,6 @@ DOT fetchbody:out -> prepresp [style=bold,color=blue]
 static enum req_fsm_nxt
 cnt_fetch(struct worker *wrk, struct req *req)
 {
-	int i;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -359,17 +358,21 @@ cnt_fetch(struct worker *wrk, struct req *req)
 	AN(req->busyobj);
 	AN(req->objcore);
 	req->acct_req.fetch++;
-	i = VBF_Fetch(wrk, req);
+	VBF_Fetch(wrk, req);
 	AN(req->busyobj);
 	AZ(req->objcore);
 	assert(req->busyobj->refcount > 0);
 	(void)HTTP1_DiscardReqBody(req);
-	if (i < 0) {
+	while (req->busyobj->state < BOS_FAILED) {
+		printf("YYY\n");
+		(void)usleep(100000);
+	}
+	if (req->busyobj->state == BOS_FAILED) {
 		VBO_DerefBusyObj(wrk, &req->busyobj);
 		req->err_code = 503;
 		req->req_step = R_STP_ERROR;
 	} else {
-		AZ(i);
+		assert (req->busyobj->state == BOS_FINISHED);
 		req->err_code = req->busyobj->err_code;
 		req->obj = req->busyobj->fetch_obj;
 		VBO_DerefBusyObj(wrk, &req->busyobj);



More information about the varnish-commit mailing list