[4.1] 18c9983 Handle comparison between backend and different things

PÃ¥l Hermunn Johansen hermunn at varnish-software.com
Fri Jan 6 14:13:04 CET 2017


commit 18c9983ebd74f8873b9fd8c2a979a9c518ccc741
Author: Pål Hermunn Johansen <hermunn at varnish-software.com>
Date:   Fri Jan 6 14:07:42 2017 +0100

    Handle comparison between backend and different things
    
    Comparing a backend with various stuff was not handled well. The test
    case shows what will give a compilation error, and the results of ways
    of comparing backends. When using a director, the demonstrated results
    are not obvious.
    
    Fixes: #2168

diff --git a/bin/varnishtest/tests/r02168.vtc b/bin/varnishtest/tests/r02168.vtc
new file mode 100644
index 0000000..c5670a8
--- /dev/null
+++ b/bin/varnishtest/tests/r02168.vtc
@@ -0,0 +1,145 @@
+varnishtest "Comparing backends with and without a director"
+
+# How you cannot compare backends - test error handling
+varnish v1 -errvcl {Not a backend} {
+	sub vcl_backend_response {
+		if (bereq.backend == bereq.http.a) {
+		}
+	}
+}
+
+varnish v1 -errvcl {Backend not found} {
+	sub vcl_backend_response {
+		if (bereq.backend == foo) {
+		}
+	}
+}
+
+varnish v1 -errvcl {Expected ID got} {
+	sub vcl_backend_response {
+		if (bereq.backend == "foo") {
+		}
+	}
+}
+
+# Compare backends with regular backend:
+server s1 {
+	rxreq
+	txresp -status 200
+} -start
+
+varnish v1 -vcl {
+	backend b1 {
+		.host = "${s1_addr}";
+		.port = "${s1_port}";
+	}
+
+	sub vcl_recv {
+		set req.backend_hint = b1;
+	}
+
+	sub vcl_backend_response {
+		set bereq.http.d1-backend = b1;
+		set bereq.http.req-backend = bereq.backend;
+		if (bereq.http.d1-backend == bereq.http.req-backend) {
+			set beresp.http.be-str-str-compare = "same";
+		} else {
+			set beresp.http.be-str-str-compare = "different";
+		}
+		if (bereq.backend == b1) {
+			set beresp.http.be-back-back-compare = "same";
+		} else {
+			set beresp.http.be-back-back-compare = "different";
+		}
+	}
+
+	sub vcl_deliver {
+		set req.http.d1-backend = b1;
+		set req.http.hint = req.backend_hint;
+		if (req.http.d1-backend == req.http.hint) {
+			set resp.http.deliver-str-str-compare = "same";
+		} else {
+			set resp.http.deliver-str-str-compare = "different";
+		}
+		if (req.backend_hint == b1) {
+			set resp.http.deliver-back-back-compare = "same";
+		} else {
+			set resp.http.deliver-back-back-compare = "different";
+		}
+	}
+
+} -start
+
+client c1 {
+	txreq
+	rxresp
+	expect resp.status == 200
+	expect resp.http.be-str-str-compare == "same"
+	expect resp.http.be-back-back-compare == "same"
+	expect resp.http.deliver-str-str-compare == "same"
+	expect resp.http.deliver-back-back-compare == "same"
+} -run
+
+# In the second part, using a director will yield different results (see bottom):
+server s2 {
+	rxreq
+	txresp -status 200
+} -start
+
+varnish v2 -vcl {
+	import ${vmod_directors};
+	backend b1 {
+		.host = "${s2_addr}";
+		.port = "${s2_port}";
+	}
+
+	sub vcl_init {
+		new d1 = directors.round_robin();
+		d1.add_backend(b1);
+	}
+
+	sub vcl_recv {
+		set req.backend_hint = d1.backend();
+	}
+
+	sub vcl_backend_response {
+		set bereq.http.d1-backend = d1.backend();
+		set bereq.http.req-backend = bereq.backend;
+		if (bereq.http.d1-backend == bereq.http.req-backend) {
+			set beresp.http.be-str-str-compare = "same";
+		} else {
+			set beresp.http.be-str-str-compare = "different";
+		}
+		if (bereq.backend == b1) {
+			set beresp.http.be-back-back-compare = "same";
+		} else {
+			set beresp.http.be-back-back-compare = "different";
+		}
+	}
+
+	sub vcl_deliver {
+		set req.http.d1-backend = d1.backend();
+		set req.http.hint = req.backend_hint;
+		if (req.http.d1-backend == req.http.hint) {
+			set resp.http.deliver-str-str-compare = "same";
+		} else {
+			set resp.http.deliver-str-str-compare = "different";
+		}
+		if (req.backend_hint == b1) {
+			set resp.http.deliver-back-back-compare = "same";
+		} else {
+			set resp.http.deliver-back-back-compare = "different";
+		}
+	}
+
+} -start
+
+client c2 -connect ${v2_sock} {
+	txreq
+	rxresp
+	expect resp.status == 200
+	expect resp.http.be-str-str-compare == "same"
+	expect resp.http.be-back-back-compare == "different"
+	expect resp.http.deliver-str-str-compare == "same"
+	expect resp.http.deliver-back-back-compare == "different"
+} -run
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index 3066db3..65bd7a4 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -1237,7 +1237,16 @@ vcc_expr_cmp(struct vcc *tl, struct expr **e, enum var_type fmt)
 		if (sym == NULL) {
 			VSB_printf(tl->sb, "Backend not found: ");
 			vcc_ErrToken(tl, tl->t);
-			VSB_printf(tl->sb, "\n");
+			VSB_printf(tl->sb,
+			    " (expected a backend identifier)\n");
+			vcc_ErrWhere(tl, tl->t);
+			return;
+		} else if (sym->kind != SYM_BACKEND) {
+			VSB_printf(tl->sb, "Not a backend: ");
+			vcc_ErrToken(tl, tl->t);
+			VSB_printf(tl->sb,
+			    " (right hand side must be a backend - saw a %s)\n",
+			    VCC_SymKind(tl, sym));
 			vcc_ErrWhere(tl, tl->t);
 			return;
 		}



More information about the varnish-commit mailing list