[master] badee4616 req: New hash_ignore_vary flag

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Mon Jun 14 13:43:06 UTC 2021


commit badee4616bc83361c52e056bea7521b638f2b235
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Mon Jun 14 12:13:41 2021 +0200

    req: New hash_ignore_vary flag
    
    It works like the hash_ignore_busy flag: it is disabled by default
    and survives a restart, but as the name implies will skip vary checks
    for object candidates.

diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index d9a4e0c69..90c7a7ca8 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -435,6 +435,7 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
 				continue;
 
 			if (oc->boc && oc->boc->vary != NULL &&
+			    !req->hash_ignore_vary &&
 			    !VRY_Match(req, oc->boc->vary)) {
 				wrk->strangelove++;
 				continue;
@@ -453,7 +454,7 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
 			continue;
 		}
 
-		if (ObjHasAttr(wrk, oc, OA_VARY)) {
+		if (!req->hash_ignore_vary && ObjHasAttr(wrk, oc, OA_VARY)) {
 			vary = ObjGetAttr(wrk, oc, OA_VARY, NULL);
 			AN(vary);
 			if (!VRY_Match(req, vary)) {
diff --git a/bin/varnishd/cache/cache_req.c b/bin/varnishd/cache/cache_req.c
index 101bf582c..e2981e69b 100644
--- a/bin/varnishd/cache/cache_req.c
+++ b/bin/varnishd/cache/cache_req.c
@@ -253,6 +253,7 @@ Req_Cleanup(struct sess *sp, struct worker *wrk, struct req *req)
 
 	req->hash_always_miss = 0;
 	req->hash_ignore_busy = 0;
+	req->hash_ignore_vary = 0;
 	req->esi_level = 0;
 	req->is_hit = 0;
 	req->req_step = R_STP_TRANSPORT;
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 34fde97a1..683b08135 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -873,6 +873,7 @@ cnt_recv_prep(struct req *req, const char *ci)
 		req->disable_esi = 0;
 		req->hash_always_miss = 0;
 		req->hash_ignore_busy = 0;
+		req->hash_ignore_vary = 0;
 		req->client_identity = NULL;
 		req->storage = NULL;
 	}
diff --git a/bin/varnishtest/tests/c00107.vtc b/bin/varnishtest/tests/c00107.vtc
new file mode 100644
index 000000000..6f3dced1f
--- /dev/null
+++ b/bin/varnishtest/tests/c00107.vtc
@@ -0,0 +1,42 @@
+varnishtest req.hash_ignore_vary
+
+server s1 {
+	rxreq
+	expect req.http.cookie ~ ab=a
+	txresp -hdr "vary: cookie" -body a
+
+	rxreq
+	expect req.http.cookie ~ ab=b
+	txresp -hdr "vary: cookie" -body b
+} -start
+
+varnish v1 -vcl+backend {
+	sub vcl_recv {
+		set req.hash_ignore_vary = req.http.user-agent ~ "bot";
+	}
+
+	sub vcl_req_cookie {
+		return;
+	}
+} -start
+
+client ca {
+	txreq -hdr "cookie: ab=a"
+	rxresp
+	expect resp.body == a
+} -run
+
+client cb {
+	txreq -hdr "cookie: ab=b"
+	rxresp
+	expect resp.body == b
+} -run
+
+client cbot {
+	txreq -hdr "user-agent: googlebot"
+	rxresp
+	expect resp.body == b
+} -run
+
+client ca -run
+client cb -run
diff --git a/doc/sphinx/reference/vcl_var.rst b/doc/sphinx/reference/vcl_var.rst
index e1a673ec9..af4c7ecdf 100644
--- a/doc/sphinx/reference/vcl_var.rst
+++ b/doc/sphinx/reference/vcl_var.rst
@@ -352,6 +352,27 @@ req.hash_ignore_busy
 	up content sideways from each other to avoid deadlocks.
 
 
+req.hash_ignore_vary
+
+	Type: BOOL
+
+	Readable from: client
+
+	Writable from: client
+
+	Default: ``false``.
+
+	Ignore objects vary headers during cache lookup.
+
+	This returns the very first match regardless of the object
+	compatibility with the client request. This is useful when
+	variants are irrelevant to certain clients, and differences
+	in the way the resouce is presented don't change how the
+	client will interpret it.
+
+	Use with caution.
+
+
 req.hash_always_miss
 
 	Type: BOOL
diff --git a/include/tbl/req_flags.h b/include/tbl/req_flags.h
index 2e826601c..0c49540db 100644
--- a/include/tbl/req_flags.h
+++ b/include/tbl/req_flags.h
@@ -34,6 +34,7 @@
 /* lower, vcl_r, vcl_w, doc */
 REQ_FLAG(disable_esi,		0, 0, "")
 REQ_FLAG(hash_ignore_busy,	1, 1, "")
+REQ_FLAG(hash_ignore_vary,	1, 1, "")
 REQ_FLAG(hash_always_miss,	1, 1, "")
 REQ_FLAG(is_hit,		0, 0, "")
 REQ_FLAG(is_hitmiss,		1, 0, "")


More information about the varnish-commit mailing list