[master] b756bacf3 add backend.list -p for directors.shard

Nils Goroll nils.goroll at uplex.de
Wed Mar 6 17:26:07 UTC 2019


commit b756bacf3789e2dfa99cb040b0fcc810b6815025
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Wed Mar 6 17:37:00 2019 +0100

    add backend.list -p for directors.shard
    
    Ref #2896

diff --git a/lib/libvmod_directors/shard_dir.c b/lib/libvmod_directors/shard_dir.c
index 54d5caabe..645d394a7 100644
--- a/lib/libvmod_directors/shard_dir.c
+++ b/lib/libvmod_directors/shard_dir.c
@@ -256,7 +256,7 @@ sharddir_delete(struct sharddir **sharddp)
 	FREE_OBJ(shardd);
 }
 
-static void
+void
 sharddir_rdlock(struct sharddir *shardd)
 {
 	CHECK_OBJ_NOTNULL(shardd, SHARDDIR_MAGIC);
diff --git a/lib/libvmod_directors/shard_dir.h b/lib/libvmod_directors/shard_dir.h
index a1e51e244..44a109b70 100644
--- a/lib/libvmod_directors/shard_dir.h
+++ b/lib/libvmod_directors/shard_dir.h
@@ -132,6 +132,7 @@ void sharddir_new(struct sharddir **sharddp, const char *vcl_name,
 void sharddir_set_param(struct sharddir *shardd,
     const struct vmod_directors_shard_param *param);
 void sharddir_delete(struct sharddir **sharddp);
+void sharddir_rdlock(struct sharddir *shardd);
 void sharddir_wrlock(struct sharddir *shardd);
 void sharddir_unlock(struct sharddir *shardd);
 VCL_BOOL sharddir_any_healthy(VRT_CTX, struct sharddir *, VCL_TIME *);
diff --git a/lib/libvmod_directors/vmod_shard.c b/lib/libvmod_directors/vmod_shard.c
index 5360f3aac..91a2dc945 100644
--- a/lib/libvmod_directors/vmod_shard.c
+++ b/lib/libvmod_directors/vmod_shard.c
@@ -40,6 +40,7 @@
 #include "vcc_if.h"
 #include "shard_dir.h"
 #include "shard_cfg.h"
+#include "vsb.h"
 
 /* -------------------------------------------------------------------------
  *  shard director: LAZY mode (vdi resolve function), parameter objects
@@ -171,6 +172,7 @@ vmod_shard_param_read(VRT_CTX, const void *id,
  */
 static vdi_healthy_f vmod_shard_healthy;
 static vdi_resolve_f vmod_shard_resolve;
+static vdi_list_f vmod_shard_list;
 
 struct vmod_directors_shard {
 	unsigned				magic;
@@ -243,7 +245,8 @@ static const struct vdi_methods vmod_shard_methods[1] = {{
 	.type =		"shard",
 	.resolve =	vmod_shard_resolve,
 	.healthy =	vmod_shard_healthy,
-	.destroy =	vmod_shard_destroy
+	.destroy =	vmod_shard_destroy,
+	.list =		vmod_shard_list
 }};
 
 
@@ -754,6 +757,111 @@ vmod_shard_resolve(VRT_CTX, VCL_BACKEND dir)
 				 pp->rampup, pp->healthy));
 }
 
+void v_matchproto_(vdi_list_f)
+vmod_shard_list(VRT_CTX, VCL_BACKEND dir, struct vsb *vsb, int pflag, int jflag)
+{
+	struct sharddir *shardd;
+	struct shard_backend *sbe;
+	VCL_TIME c, changed = 0;
+	VCL_DURATION rampup_d, d;
+	VCL_BACKEND be;
+	VCL_BOOL h;
+	unsigned u, nh = 0;
+	double rampup_p;
+
+	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+	CHECK_OBJ_NOTNULL(dir, DIRECTOR_MAGIC);
+	CAST_OBJ_NOTNULL(shardd, dir->priv, SHARDDIR_MAGIC);
+
+	if (pflag) {
+		if (jflag) {
+			VSB_cat(vsb, "{\n");
+			VSB_indent(vsb, 2);
+			VSB_printf(vsb, "\"warmup\": %f,\n", shardd->warmup);
+			VSB_printf(vsb, "\"rampup_duration\": %f,\n",
+			    shardd->rampup_duration);
+			VSB_cat(vsb, "\"backends\": {\n");
+			VSB_indent(vsb, 2);
+		} else {
+			VSB_cat(vsb, "\n\n\tBackend\tIdent\tHealth\t"
+			    "Rampup  Remaining\n");
+		}
+	}
+
+	sharddir_rdlock(shardd);
+	for (u = 0; u < shardd->n_backend; u++) {
+		sbe = &shardd->backend[u];
+		AN(sbe);
+		be = sbe->backend;
+		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;
+
+		d = ctx->now - c;
+		rampup_d = shardcfg_get_rampup(shardd, u);
+		if (! h) {
+			rampup_p = 0.0;
+			rampup_d = 0.0;
+		} else if (d < rampup_d) {
+			rampup_p = d / rampup_d;
+			rampup_d -= d;
+		} else {
+			rampup_p = 1.0;
+			rampup_d = 0.0;
+		}
+
+		if (jflag) {
+			if (u)
+				VSB_cat(vsb, ",\n");
+			VSB_printf(vsb, "\"%s\": {\n",
+			    be->vcl_name);
+			VSB_indent(vsb, 2);
+			VSB_printf(vsb, "\"ident\": \"%s\",\n",
+			    sbe->ident ? sbe->ident : be->vcl_name);
+			VSB_printf(vsb, "\"health\": \"%s\",\n",
+			    h ? "healthy" : "sick");
+			VSB_printf(vsb, "\"canon_point\": %u,\n",
+			    sbe->canon_point);
+			VSB_printf(vsb, "\"rampup\": %f,\n", rampup_p);
+			VSB_printf(vsb, "\"rampup_remaining\": %.3f\n",
+			    rampup_d);
+			VSB_indent(vsb, -2);
+			VSB_cat(vsb, "}");
+		} else {
+			VSB_printf(vsb, "\t%s\t\%s\t%s\t%6.2f%% %8.3fs\n",
+			    be->vcl_name,
+			    sbe->ident ? sbe->ident : be->vcl_name,
+			    h ? "healthy" : "sick",
+			    rampup_p * 100, rampup_d);
+		}
+	}
+	sharddir_unlock(shardd);
+
+	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;
+
+	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");
+}
+
 VCL_VOID v_matchproto_(td_directors_shard_backend)
 vmod_shard_debug(VRT_CTX, struct vmod_directors_shard *vshard,
     VCL_INT i)


More information about the varnish-commit mailing list