[master] 1a49e049d vcl: Session timeouts can now be unset

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Tue Mar 5 08:53:08 UTC 2024


commit 1a49e049d787005deab2afd1bd143404402f5a09
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Wed Feb 28 17:01:56 2024 +0100

    vcl: Session timeouts can now be unset
    
    They were already relying on NAN to fall back to parameters.

diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index 9a14519b8..e509aea4b 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -1135,7 +1135,7 @@ set_idle_send_timeout(const struct sess *sp, VCL_DURATION d)
 
 #define SESS_VAR_DUR(x, setter)				\
 VCL_VOID						\
-VRT_l_sess_##x(VRT_CTX, VCL_DURATION d)		\
+VRT_l_sess_##x(VRT_CTX, VCL_DURATION d)			\
 {							\
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);		\
 	CHECK_OBJ_NOTNULL(ctx->sp, SESS_MAGIC);		\
@@ -1145,11 +1145,19 @@ VRT_l_sess_##x(VRT_CTX, VCL_DURATION d)		\
 }							\
 							\
 VCL_DURATION						\
-VRT_r_sess_##x(VRT_CTX)				\
+VRT_r_sess_##x(VRT_CTX)					\
 {							\
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);		\
 	CHECK_OBJ_NOTNULL(ctx->sp, SESS_MAGIC);		\
 	return (SESS_TMO(ctx->sp, x));			\
+}							\
+							\
+VCL_VOID						\
+VRT_u_sess_##x(VRT_CTX)					\
+{							\
+	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);		\
+	CHECK_OBJ_NOTNULL(ctx->sp, SESS_MAGIC);		\
+	ctx->sp->x = NAN;				\
 }
 
 SESS_VAR_DUR(timeout_idle, )
diff --git a/bin/varnishtest/tests/v00069.vtc b/bin/varnishtest/tests/v00069.vtc
new file mode 100644
index 000000000..03ffcfdaa
--- /dev/null
+++ b/bin/varnishtest/tests/v00069.vtc
@@ -0,0 +1,61 @@
+varnishtest "Unset session timeouts"
+
+varnish v1 -cliok "param.set timeout_idle 42"
+varnish v1 -cliok "param.set timeout_linger 42"
+varnish v1 -cliok "param.set idle_send_timeout 42"
+varnish v1 -cliok "param.set send_timeout 42"
+
+varnish v1 -vcl {
+	backend be none;
+
+	sub vcl_recv {
+		return (synth(200));
+	}
+
+	sub vcl_synth {
+		set resp.http.def_timeout_idle = sess.timeout_idle;
+		set resp.http.def_timeout_linger = sess.timeout_linger;
+		set resp.http.def_idle_send_timeout = sess.idle_send_timeout;
+		set resp.http.def_send_timeout = sess.send_timeout;
+
+		set sess.timeout_idle = 0s;
+		set sess.timeout_linger = 0s;
+		set sess.idle_send_timeout = 0s;
+		set sess.send_timeout = 0s;
+
+		set resp.http.set_timeout_idle = sess.timeout_idle;
+		set resp.http.set_timeout_linger = sess.timeout_linger;
+		set resp.http.set_idle_send_timeout = sess.idle_send_timeout;
+		set resp.http.set_send_timeout = sess.send_timeout;
+
+		unset sess.timeout_idle;
+		unset sess.timeout_linger;
+		unset sess.idle_send_timeout;
+		unset sess.send_timeout;
+
+		set resp.http.unset_timeout_idle = sess.timeout_idle;
+		set resp.http.unset_timeout_linger = sess.timeout_linger;
+		set resp.http.unset_idle_send_timeout = sess.idle_send_timeout;
+		set resp.http.unset_send_timeout = sess.send_timeout;
+	}
+} -start
+
+client c1 {
+	txreq
+	rxresp
+
+	expect resp.http.def_timeout_idle == 42.000
+	expect resp.http.def_timeout_linger == 42.000
+	expect resp.http.def_idle_send_timeout == 42.000
+	expect resp.http.def_send_timeout == 42.000
+
+	expect resp.http.set_timeout_idle == 0.000
+	expect resp.http.set_timeout_linger == 0.000
+	expect resp.http.set_idle_send_timeout == 0.000
+	expect resp.http.set_send_timeout == 0.000
+
+	expect resp.http.unset_timeout_idle == 42.000
+	expect resp.http.unset_timeout_linger == 42.000
+	expect resp.http.unset_idle_send_timeout == 42.000
+	expect resp.http.unset_send_timeout == 42.000
+} -run
diff --git a/doc/sphinx/reference/vcl_var.rst b/doc/sphinx/reference/vcl_var.rst
index 16bb9c8c7..3be25d54e 100644
--- a/doc/sphinx/reference/vcl_var.rst
+++ b/doc/sphinx/reference/vcl_var.rst
@@ -1781,6 +1781,8 @@ sess.idle_send_timeout
 
 	Writable from: client
 
+	Unsetable from: client
+
 	Send timeout for individual pieces of data on client
 	connections, defaults to the ``idle_send_timeout`` parameter,
 	see :ref:`varnishd(1)`
@@ -1796,6 +1798,8 @@ sess.send_timeout
 
 	Writable from: client
 
+	Unsetable from: client
+
 	Total timeout for ordinary HTTP1 responses, defaults to the
 	``send_timeout`` parameter, see :ref:`varnishd(1)`
 
@@ -1810,6 +1814,8 @@ sess.timeout_idle
 
 	Writable from: client
 
+	Unsetable from: client
+
 	Idle timeout for this session, defaults to the
 	``timeout_idle`` parameter, see :ref:`varnishd(1)`
 
@@ -1824,6 +1830,8 @@ sess.timeout_linger
 
 	Writable from: client
 
+	Unsetable from: client
+
 	Linger timeout for this session, defaults to the
 	``timeout_linger`` parameter, see :ref:`varnishd(1)`
 
diff --git a/include/vrt.h b/include/vrt.h
index f5ea03bc5..8bbdf8186 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -60,6 +60,10 @@
  * NEXT (2024-03-15)
  *	[cache.h] (struct req).filter_list renamed to vdp_filter_list
  *	order of vcl/vmod and director COLD events reversed to directors first
+ *	VRT_u_sess_idle_send_timeout() added
+ *	VRT_u_sess_send_timeout() added
+ *	VRT_u_sess_timeout_idle() added
+ *	VRT_u_sess_timeout_linger() added
  * 18.1 (2023-12-05)
  *	vbf_objiterate() implementation changed #4013
  * 18.0 (2023-09-15)


More information about the varnish-commit mailing list