[master] 92d01627c add probe details for directors.fallback

Nils Goroll nils.goroll at uplex.de
Wed Mar 6 12:20:09 UTC 2019


commit 92d01627ca7a8f07ffb513a3e20cf9e8260dc6d6
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Wed Mar 6 13:18:45 2019 +0100

    add probe details for directors.fallback
    
    Ref #2896

diff --git a/lib/libvmod_directors/fall_back.c b/lib/libvmod_directors/fall_back.c
index 02ac28186..f00a6f11e 100644
--- a/lib/libvmod_directors/fall_back.c
+++ b/lib/libvmod_directors/fall_back.c
@@ -36,6 +36,7 @@
 #include "vcc_if.h"
 
 #include "vdir.h"
+#include "vsb.h"
 
 struct vmod_directors_fallback {
 	unsigned				magic;
@@ -56,6 +57,94 @@ vmod_fallback_healthy(VRT_CTX, VCL_BACKEND dir, VCL_TIME *changed)
 	return (vdir_any_healthy(ctx, fb->vd, changed));
 }
 
+static void v_matchproto_(vdi_list_f)
+vmod_fallback_list(VRT_CTX, VCL_BACKEND dir, struct vsb *vsb, int pflag,
+    int jflag)
+{
+	struct vmod_directors_fallback *fb;
+	struct vdir *vd;
+	VCL_TIME c, changed = 0;
+	VCL_BACKEND be;
+	VCL_BOOL h;
+	unsigned u, nh = 0;
+
+	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+	CHECK_OBJ_NOTNULL(dir, DIRECTOR_MAGIC);
+	CAST_OBJ_NOTNULL(fb, dir->priv, VMOD_DIRECTORS_FALLBACK_MAGIC);
+	CAST_OBJ_NOTNULL(vd, fb->vd, VDIR_MAGIC);
+
+	if (pflag) {
+		if (jflag) {
+			VSB_cat(vsb, "{\n");
+			VSB_indent(vsb, 2);
+			VSB_printf(vsb, "\"sticky\": %s,\n",
+			    fb->st ? "true" : "false");
+			VSB_cat(vsb, "\"backends\": {\n");
+			VSB_indent(vsb, 2);
+		} else {
+			VSB_cat(vsb, "\n\n\tBackend\tCurrent\tHealth\n");
+		}
+	}
+
+	vdir_rdlock(vd);
+	for (u = 0; u < vd->n_backend; u++) {
+		be = vd->backend[u];
+		CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
+		c = 0;
+		h = VRT_Healthy(ctx, be, &c);
+		if (h)
+			nh++;
+		if (c > changed)
+			changed = c;
+		if ((pflag) == 0)
+			continue;
+		if (jflag) {
+			if (u)
+				VSB_cat(vsb, ",\n");
+			VSB_printf(vsb, "\"%s\": [%s, \"%s\"]",
+			    be->vcl_name,
+			    fb->cur == u ? "true" : "false",
+			    h ? "healthy" : "sick");
+		} else {
+			VSB_cat(vsb, "\t");
+			VSB_cat(vsb, be->vcl_name);
+			if (fb->cur == u)
+				VSB_cat(vsb, "\t*\t");
+			else
+				VSB_cat(vsb, "\t\t");
+			VSB_cat(vsb, h ? "healthy" : "sick");
+			VSB_cat(vsb, "\n");
+		}
+	}
+	vdir_unlock(vd);
+
+	VRT_SetChanged(vd->dir, changed);
+
+	if (jflag && (pflag)) {
+		VSB_cat(vsb, "\n");
+		VSB_indent(vsb, -2);
+		VSB_cat(vsb, "},\n");
+		VSB_indent(vsb, -2);
+		VSB_cat(vsb, "},\n");
+	}
+
+	if (pflag)
+		return;
+
+	/*
+	 * for health state, the api-correct thing would be to call our own
+	 * healthy function, but that would just re-iterate the backends for no
+	 * real benefit
+	 */
+
+	if (jflag)
+		VSB_printf(vsb, "[%u, %u, \"%s\"]", nh, u,
+		    nh ? "healthy" : "sick");
+	else
+		VSB_printf(vsb, "%u/%u\t%s", nh, u, nh ? "healthy" : "sick");
+
+}
+
 static VCL_BACKEND v_matchproto_(vdi_resolve_f)
 vmod_fallback_resolve(VRT_CTX, VCL_BACKEND dir)
 {
@@ -99,7 +188,8 @@ static const struct vdi_methods vmod_fallback_methods[1] = {{
 	.type =			"fallback",
 	.healthy =		vmod_fallback_healthy,
 	.resolve =		vmod_fallback_resolve,
-	.destroy =		vmod_fallback_destroy
+	.destroy =		vmod_fallback_destroy,
+	.list =			vmod_fallback_list
 }};
 
 


More information about the varnish-commit mailing list