[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