[master] 8f2d2e7 Make FetchBody() pool-task compatible.

Poul-Henning Kamp phk at varnish-cache.org
Mon Mar 5 15:38:38 CET 2012


commit 8f2d2e7bce9bf5a614a42a296b0b49d67ec4be25
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Mar 5 14:37:54 2012 +0000

    Make FetchBody() pool-task compatible.
    
    Add #ifdef 0'ed code to put another thread on body-fetching
    
    Hugely inpired by patches from:	martin

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 63ea682..2bae6b4 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -479,6 +479,8 @@ struct busyobj {
 	struct http_conn	htc;
 
 	enum body_status	body_status;
+	struct pool_task	task;
+
 	struct vef_priv		*vef_priv;
 
 	unsigned		should_close;
@@ -755,7 +757,7 @@ struct storage *FetchStorage(struct busyobj *, ssize_t sz);
 int FetchError(struct busyobj *, const char *error);
 int FetchError2(struct busyobj *, const char *error, const char *more);
 int FetchHdr(struct sess *sp, int need_host_hdr, int sendbody);
-void FetchBody(struct worker *w, struct busyobj *bo);
+void FetchBody(struct worker *w, void *bo);
 int FetchReqBody(const struct sess *sp, int sendbody);
 void Fetch_Init(void);
 
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index d13fc46..ecea4b5 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -903,8 +903,19 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
 	bo = req->busyobj;
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 
+#if 1
 	FetchBody(wrk, bo);
-	bo->fetch_obj = NULL;
+#else
+	bo->task.func = FetchBody;
+	bo->task.priv = bo;
+	if (Pool_Task(wrk->pool, &bo->task, POOL_NO_QUEUE)) {
+		FetchBody(wrk, bo);
+	} else {
+		while (bo->state < BOS_FAILED)
+			(void)usleep(10000);
+	}
+#endif
+	assert(bo->state >= BOS_FAILED);
 
 	http_Teardown(bo->bereq);
 	http_Teardown(bo->beresp);
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 4fc0f8e..88bca02 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -530,7 +530,7 @@ FetchHdr(struct sess *sp, int need_host_hdr, int sendbody)
 /*--------------------------------------------------------------------*/
 
 void
-FetchBody(struct worker *wrk, struct busyobj *bo)
+FetchBody(struct worker *wrk, void *priv)
 {
 	int cls;
 	struct storage *st;
@@ -538,9 +538,10 @@ FetchBody(struct worker *wrk, struct busyobj *bo)
 	ssize_t cl;
 	struct http_conn *htc;
 	struct object *obj;
+	struct busyobj *bo;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+	CAST_OBJ_NOTNULL(bo, priv, BUSYOBJ_MAGIC);
 	CHECK_OBJ_NOTNULL(bo->vbc, VBC_MAGIC);
 	obj = bo->fetch_obj;
 	CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);



More information about the varnish-commit mailing list