[PATCH 21/25] Add run-time parameter stream_pass_bufsize and VCL variable beresp.stream_pass_bufsize with test case

Martin Blix Grydeland martin at varnish-software.com
Sun Jan 22 18:53:27 CET 2012


---
 bin/varnishd/cache/cache.h         |    1 +
 bin/varnishd/cache/cache_busyobj.c |    2 ++
 bin/varnishd/cache/cache_vrt_var.c |   19 +++++++++++++++++++
 bin/varnishd/common/params.h       |    2 ++
 bin/varnishd/mgt/mgt_param.c       |    6 ++++++
 bin/varnishtest/tests/t00009.vtc   |   33 +++++++++++++++++++++++++++++++++
 lib/libvcl/generate.py             |    6 ++++++
 7 files changed, 69 insertions(+), 0 deletions(-)
 create mode 100644 bin/varnishtest/tests/t00009.vtc

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 880f5e3..fe65dbd 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -543,6 +543,7 @@ struct busyobj {
 	ssize_t			stream_max;
 	struct storage		*stream_frontchunk;
 	unsigned		stream_stopped;
+	ssize_t			stream_pass_bufsize;
 };
 
 /* Object structure --------------------------------------------------*/
diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
index 6eec464..b39c170 100644
--- a/bin/varnishd/cache/cache_busyobj.c
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -144,6 +144,8 @@ VBO_GetBusyObj(struct worker *wrk)
 	p += HTTP_estimate(vbo->nhttp);
 	vbo->bo.beresp = HTTP_create(p, vbo->nhttp);
 
+	vbo->bo.stream_pass_bufsize = cache_param->stream_pass_bufsize;
+
 	return (&vbo->bo);
 }
 
diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index e051dbb..e655abf 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -301,6 +301,25 @@ VRT_l_beresp_storage(struct sess *sp, const char *str, ...)
 	sp->req->storage_hint = b;
 }
 
+double
+VRT_r_beresp_stream_pass_bufsize(const struct sess *sp)
+{
+	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	CHECK_OBJ_NOTNULL(sp->wrk->busyobj, BUSYOBJ_MAGIC);
+	return (sp->wrk->busyobj->stream_pass_bufsize);
+}
+
+void
+VRT_l_beresp_stream_pass_bufsize(const struct sess *sp, double val)
+{
+	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	CHECK_OBJ_NOTNULL(sp->wrk->busyobj, BUSYOBJ_MAGIC);
+	if (val >= 0.)
+		sp->wrk->busyobj->stream_pass_bufsize = val;
+	else
+		sp->wrk->busyobj->stream_pass_bufsize = 0;
+}
+
 /*--------------------------------------------------------------------*/
 
 void
diff --git a/bin/varnishd/common/params.h b/bin/varnishd/common/params.h
index f726ce8..20b346a 100644
--- a/bin/varnishd/common/params.h
+++ b/bin/varnishd/common/params.h
@@ -100,6 +100,8 @@ struct params {
 	ssize_t			fetch_maxchunksize;
 	ssize_t			stream_maxchunksize;
 	unsigned		stream_grab_timeout;
+	ssize_t			stream_pass_bufsize;
+
 	unsigned		nuke_limit;
 
 #ifdef SENDFILE_WORKS
diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c
index 9b1467f..3a64b96 100644
--- a/bin/varnishd/mgt/mgt_param.c
+++ b/bin/varnishd/mgt/mgt_param.c
@@ -852,6 +852,12 @@ static const struct parspec input_parspec[] = {
 		"grabbing a thread for background fetch.\n",
 		EXPERIMENTAL,
 		"100", "milliseconds" },
+	{ "stream_pass_bufsize",
+		tweak_bytes_u, &mgt_param.stream_pass_bufsize, 0, UINT_MAX,
+		"Default max amount of data to buffer when streaming passes. "
+		"Zero means unlimited.\n",
+		EXPERIMENTAL,
+		"10mb", "bytes" },
 #ifdef SENDFILE_WORKS
 	{ "sendfile_threshold",
 		tweak_bytes, &mgt_param.sendfile_threshold, 0, HUGE_VAL,
diff --git a/bin/varnishtest/tests/t00009.vtc b/bin/varnishtest/tests/t00009.vtc
new file mode 100644
index 0000000..834ba80
--- /dev/null
+++ b/bin/varnishtest/tests/t00009.vtc
@@ -0,0 +1,33 @@
+varnishtest "Test streaming vcl syntax"
+
+server s1 {
+	rxreq
+	txresp
+} -start
+
+varnish v1 -arg "-p stream_pass_bufsize=1M" -vcl+backend {
+	sub vcl_fetch {
+		set beresp.do_stream = true;
+		set beresp.http.spb-orig = beresp.stream_pass_bufsize;
+		set beresp.stream_pass_bufsize = 1024B;
+		set beresp.stream_pass_bufsize = 1KB;
+		set beresp.stream_pass_bufsize = 10MB;
+		set beresp.stream_pass_bufsize = 1GB;
+		set beresp.stream_pass_bufsize = 0B - 1B;
+		set beresp.http.spb = beresp.stream_pass_bufsize;
+	}
+} -start
+
+client c1 {
+	txreq
+	rxresp
+	expect resp.http.spb-orig == "1048576.000"
+	expect resp.http.spb == "0.000"
+} -run
+
+varnish v1 -badvcl {
+	backend default { .host = "127.0.0.1"; }
+	sub vcl_fetch {
+		set beresp.stream_pass_bufsize = 0;
+	}
+}
diff --git a/lib/libvcl/generate.py b/lib/libvcl/generate.py
index b91f675..51b2294 100755
--- a/lib/libvcl/generate.py
+++ b/lib/libvcl/generate.py
@@ -331,6 +331,12 @@ sp_variables = (
 		( 'fetch',),
 		'const struct sess *'
 	),
+	('beresp.stream_pass_bufsize',
+		'BYTES',
+		( 'fetch',),
+		( 'fetch',),
+		'const struct sess *'
+	),
 	('beresp.ttl',
 		'DURATION',
 		( 'fetch',),
-- 
1.7.4.1




More information about the varnish-dev mailing list