[experimental-ims] ac35ccf Split "prepfetch" from "fetchbody"
Geoff Simmons
geoff at varnish-cache.org
Tue Jan 31 21:47:23 CET 2012
commit ac35ccf8beb8adcd888f71200dba2ea79a1da481
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Jan 31 08:21:29 2012 +0000
Split "prepfetch" from "fetchbody"
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index 3286abf..d12101d 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -565,8 +565,8 @@ DOT label="obj.f.pass=true"
DOT ]
DOT vcl_fetch -> fetch_pass [label="hit_for_pass",style=bold,color=red]
DOT }
-DOT fetch:hfp -> fetchbody [style=bold,color=red]
-DOT fetch:del -> fetchbody [label="deliver",style=bold,color=blue]
+DOT fetch:hfp -> prepfetch [style=bold,color=red]
+DOT fetch:del -> prepfetch [label="deliver",style=bold,color=blue]
*/
static int
@@ -635,7 +635,7 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req)
AZ(wrk->busyobj->do_esi);
AZ(wrk->busyobj->do_pass);
-
+
VCL_fetch_method(sp);
if (req->objcore != NULL && wrk->busyobj->do_pass)
@@ -644,7 +644,7 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req)
switch (req->handling) {
case VCL_RET_DELIVER:
AssertObjCorePassOrBusy(req->objcore);
- sp->step = STP_FETCHBODY;
+ sp->step = STP_PREPFETCH;
return (0);
default:
break;
@@ -680,30 +680,22 @@ cnt_fetch(struct sess *sp, struct worker *wrk, struct req *req)
}
/*--------------------------------------------------------------------
- * Fetch response body from the backend
+ * Prepare to fetch body from backend
*
DOT subgraph xcluster_body {
-DOT fetchbody [
-DOT shape=diamond
-DOT label="stream ?"
-DOT ]
-DOT fetchbody2 [
-DOT shape=ellipse
-DOT label="fetch body\nfrom backend\n"
+DOT prepfetch [
+DOT shape=record
+DOT label="{cnt_prepfetch:|error?|<out>stream ?}"
DOT ]
DOT }
-DOT fetchbody -> fetchbody2 [label=no,style=bold,color=red]
-DOT fetchbody -> fetchbody2 [style=bold,color=blue]
-DOT fetchbody -> prepresp [label=yes,style=bold,color=cyan]
-DOT fetchbody2 -> prepresp [style=bold,color=red]
-DOT fetchbody2 -> prepresp [style=bold,color=blue]
+DOT prepfetch:out -> fetchbody [style=bold,color=red]
+DOT prepfetch:out -> fetchbody [style=bold,color=blue]
+DOT prepfetch:out -> prepresp [label=yes,style=bold,color=cyan]
*/
-
static int
-cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
+cnt_prepfetch(struct sess *sp, struct worker *wrk, struct req *req)
{
- int i;
struct http *hp, *hp2;
char *b;
uint16_t nhttp;
@@ -888,7 +880,36 @@ cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
if (bo->do_stream) {
sp->step = STP_PREPRESP;
return (0);
+ } else {
+ sp->step = STP_FETCHBODY;
+ return (0);
}
+}
+
+/*--------------------------------------------------------------------
+ * Actually fetch body from backend
+ *
+DOT subgraph xcluster_fetchbody {
+DOT fetchbody [
+DOT shape=record
+DOT label="{cnt_fetchbody:|error ?|<out>success ?}"
+DOT ]
+DOT }
+DOT fetchbody:out -> prepresp [style=bold,color=red]
+DOT fetchbody:out -> prepresp [style=bold,color=blue]
+ */
+
+static int
+cnt_fetchbody(struct sess *sp, struct worker *wrk, struct req *req)
+{
+ int i;
+ struct busyobj *bo;
+
+ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+ bo = wrk->busyobj;
+ CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
/* Use unmodified headers*/
i = FetchBody(wrk, req->obj);
diff --git a/include/tbl/steps.h b/include/tbl/steps.h
index 6fcd74e..1e95529 100644
--- a/include/tbl/steps.h
+++ b/include/tbl/steps.h
@@ -39,6 +39,7 @@ STEP(lookup, LOOKUP, (sp, sp->wrk, sp->req))
STEP(miss, MISS, (sp, sp->wrk, sp->req))
STEP(hit, HIT, (sp, sp->wrk, sp->req))
STEP(fetch, FETCH, (sp, sp->wrk, sp->req))
+STEP(prepfetch, PREPFETCH, (sp, sp->wrk, sp->req))
STEP(fetchbody, FETCHBODY, (sp, sp->wrk, sp->req))
STEP(streambody, STREAMBODY, (sp, sp->wrk, sp->req))
STEP(prepresp, PREPRESP, (sp, sp->wrk, sp->req))
More information about the varnish-commit
mailing list