[master] 44f6acb Shuffle things a little bit closer to streaming

Poul-Henning Kamp phk at varnish-cache.org
Mon Aug 26 09:21:53 CEST 2013


commit 44f6acb45bba91feb21b36dddc1b4c867583d61a
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Aug 26 07:21:33 2013 +0000

    Shuffle things a little bit closer to streaming

diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 22282e3..bd97a59 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -97,6 +97,9 @@ cnt_stream(struct worker *wrk, struct req *req)
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	bo = req->busyobj;
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+	AN(bo->do_stream);
+
+	INCOMPL();
 
 	CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
 	CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
@@ -106,7 +109,6 @@ cnt_stream(struct worker *wrk, struct req *req)
 	AZ(bo->do_esi);
 
 	if (wrk->handling == VCL_RET_RESTART) {
-		AN(bo->do_stream);
 		assert(req->obj == bo->fetch_obj);
 		req->obj = NULL;
 		VBO_DerefBusyObj(wrk, &req->busyobj);
@@ -223,8 +225,13 @@ cnt_deliver(struct worker *wrk, struct req *req)
 		wrk->handling = VCL_RET_DELIVER;
 
 	if (req->busyobj != NULL) {
-		req->req_step = R_STP_STREAM;
-		return (REQ_FSM_MORE);
+		AN(req->busyobj->do_stream);
+		/* Don't stream if already finished */
+		if (req->busyobj->state != BOS_FINISHED) {
+			req->req_step = R_STP_STREAM;
+			return (REQ_FSM_MORE);
+		}
+		VBO_DerefBusyObj(wrk, &req->busyobj);
 	}
 
 	if (wrk->handling == VCL_RET_RESTART) {
@@ -254,13 +261,11 @@ cnt_deliver(struct worker *wrk, struct req *req)
 DOT subgraph xcluster_error {
 DOT	vcl_error [
 DOT		shape=record
-DOT		label="vcl_error()|resp."
+DOT		label="{{vcl_error()|resp.}|{<del>deliver?|<restart>restart?}}"
 DOT	]
 DOT	ERROR -> vcl_error
-DOT	vcl_error-> deliver [label=deliver]
+DOT	vcl_error:del:s -> deliver [label=deliver]
 DOT }
-DOT vcl_error-> rsterr [label="restart",color=purple]
-DOT rsterr [label="RESTART",shape=plaintext]
  */
 
 static enum req_fsm_nxt
@@ -350,40 +355,47 @@ cnt_error(struct worker *wrk, struct req *req)
 DOT subgraph xcluster_body {
 DOT	fetch [
 DOT		shape=record
-DOT		label="{cnt_fetch:|start fetch_thread}"
+DOT		label="{cnt_fetch:|wait for fetch|{<ok>OK|<err>Failed}}"
 DOT	]
 DOT }
-DOT fetch -> deliver [style=bold,color=red]
-DOT fetch -> deliver [style=bold,color=blue]
+DOT fetch:ok:s -> deliver [style=bold,color=red]
+DOT fetch:ok:s -> deliver [style=bold,color=blue]
+DOT fetch:err:s -> vcl_error
  */
 
 static enum req_fsm_nxt
 cnt_fetch(struct worker *wrk, struct req *req)
 {
+	struct busyobj *bo;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+	bo = req->busyobj;
+	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 
 	req->acct_req.fetch++;
-	AN(req->busyobj);
-	assert(req->busyobj->refcount > 0);
+	assert(bo->refcount > 0);
 	(void)HTTP1_DiscardReqBody(req);
-	while (req->busyobj->state < BOS_FINISHED) {
-		printf("YYY\n");
-		(void)usleep(100000);
-	}
-	if (req->busyobj->state == BOS_FAILED) {
+
+	/* If we are not allowed to stream, don't. */
+	if (1 || !bo->do_stream)  			// XXX
+		VBO_waitstate(bo, BOS_FINISHED);
+	else
+		VBO_waitstate(bo, BOS_FETCHING);
+
+	if (bo->state == BOS_FAILED) {
 		VBO_DerefBusyObj(wrk, &req->busyobj);
 		req->err_code = 503;
 		req->req_step = R_STP_ERROR;
-	} else {
-		assert (req->busyobj->state == BOS_FINISHED);
-		req->err_code = req->busyobj->err_code;
-		req->obj = req->busyobj->fetch_obj;
-		VBO_DerefBusyObj(wrk, &req->busyobj);
-		assert(WRW_IsReleased(wrk));
-		req->req_step = R_STP_DELIVER;
+		return (REQ_FSM_MORE);
 	}
+
+	assert (bo->state >= BOS_FETCHING);
+	req->err_code = bo->err_code;
+	req->obj = bo->fetch_obj;
+	VBO_DerefBusyObj(wrk, &req->busyobj);
+	assert(WRW_IsReleased(wrk));
+	req->req_step = R_STP_DELIVER;
 	return (REQ_FSM_MORE);
 }
 



More information about the varnish-commit mailing list