[master] bc5f754f2 Also add a ctx to vdi_list_f (director list callback)

Nils Goroll nils.goroll at uplex.de
Mon Feb 4 18:39:08 UTC 2019


commit bc5f754f2c153650ac3b3f10ec7397c14bfbb203
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Mon Feb 4 19:24:26 2019 +0100

    Also add a ctx to vdi_list_f (director list callback)
    
    ... to bring "more nuance" (quote phk) to the director health
    state output, the list callback needs to be able to query
    VRT_Health() of the director's backends, so, in turn, we also
    need a CTX here.
    
    Ref https://github.com/varnishcache/varnish-cache/pull/2888#issuecomment-460258147
    
    Of the following out-of-tree vmods, none uses the .list callback,
    so I expect minimal vmod author uprise:
    
            - saintmode (varnish-modules)
            - all_healthy
            - dynamic
            - cluster
            - weightadjust (someome(tm) needs to update to vdi_methods)

diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index f1426f618..2c8ce70f8 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -445,12 +445,14 @@ vbe_panic(const struct director *d, struct vsb *vsb)
 /*--------------------------------------------------------------------
  */
 
-static void
-vbe_list(const struct director *d, struct vsb *vsb, int vflag, int pflag,
-    int jflag)
+static void v_matchproto_(vdi_list_f)
+vbe_list(VRT_CTX, const struct director *d, struct vsb *vsb, int vflag,
+    int pflag, int jflag)
 {
 	struct backend *bp;
 
+	(void)ctx;
+
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	CAST_OBJ_NOTNULL(bp, d->priv, BACKEND_MAGIC);
 
diff --git a/bin/varnishd/cache/cache_director.c b/bin/varnishd/cache/cache_director.c
index 9bb13a444..152418d55 100644
--- a/bin/varnishd/cache/cache_director.c
+++ b/bin/varnishd/cache/cache_director.c
@@ -278,15 +278,9 @@ struct list_args {
 };
 
 static const char *
-cli_health(struct director *d)
+cli_health(VRT_CTX, struct director *d)
 {
-	struct vrt_ctx *ctx;
-	VCL_BOOL healthy;
-
-	ctx = VCL_Get_CliCtx(0,0);
-	healthy = VRT_Healthy(ctx, d, NULL);
-	VCL_Rel_CliCtx(&ctx);
-	AZ(ctx);
+	VCL_BOOL healthy = VRT_Healthy(ctx, d, NULL);
 
 	return (healthy ? "healthy" : "sick");
 }
@@ -296,6 +290,7 @@ do_list(struct cli *cli, struct director *d, void *priv)
 {
 	char time_str[VTIM_FORMAT_SIZE];
 	struct list_args *la;
+	struct vrt_ctx *ctx;
 
 	CAST_OBJ_NOTNULL(la, priv, LIST_ARGS_MAGIC);
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
@@ -303,18 +298,24 @@ do_list(struct cli *cli, struct director *d, void *priv)
 	if (d->vdir->admin_health == VDI_AH_DELETED)
 		return (0);
 
+	ctx = VCL_Get_CliCtx(0,0);
+
 	// XXX admin health "probe" for the no-probe case is confusing
 	VCLI_Out(cli, "\n%-30s %-7s ", d->vdir->cli_name, VDI_Ahealth(d));
 
 	if (d->vdir->methods->list != NULL)
-		d->vdir->methods->list(d, cli->sb, 0, 0, 0);
+		d->vdir->methods->list(ctx, d, cli->sb, 0, 0, 0);
 	else
-		VCLI_Out(cli, "%-10s", cli_health(d));
+		VCLI_Out(cli, "%-10s", cli_health(ctx, d));
 
 	VTIM_format(d->vdir->health_changed, time_str);
 	VCLI_Out(cli, " %s", time_str);
 	if ((la->p || la->v) && d->vdir->methods->list != NULL)
-		d->vdir->methods->list(d, cli->sb, la->p, la->v, 0);
+		d->vdir->methods->list(ctx, d, cli->sb, la->p, la->v, 0);
+
+	VCL_Rel_CliCtx(&ctx);
+	AZ(ctx);
+
 	return (0);
 }
 
@@ -322,6 +323,7 @@ static int v_matchproto_(vcl_be_func)
 do_list_json(struct cli *cli, struct director *d, void *priv)
 {
 	struct list_args *la;
+	struct vrt_ctx *ctx;
 
 	CAST_OBJ_NOTNULL(la, priv, LIST_ARGS_MAGIC);
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
@@ -329,6 +331,8 @@ do_list_json(struct cli *cli, struct director *d, void *priv)
 	if (d->vdir->admin_health == VDI_AH_DELETED)
 		return (0);
 
+	ctx = VCL_Get_CliCtx(0,0);
+
 	VCLI_Out(cli, "%s", la->jsep);
 	la->jsep = ",\n";
 	// XXX admin health "probe" for the no-probe case is confusing
@@ -339,18 +343,22 @@ do_list_json(struct cli *cli, struct director *d, void *priv)
 	VCLI_Out(cli, "\"admin_health\": \"%s\",\n", VDI_Ahealth(d));
 	VCLI_Out(cli, "\"probe_message\": ");
 	if (d->vdir->methods->list != NULL)
-		d->vdir->methods->list(d, cli->sb, 0, 0, 1);
+		d->vdir->methods->list(ctx, d, cli->sb, 0, 0, 1);
 	else
-		VCLI_Out(cli, "\"%s\"", cli_health(d));
+		VCLI_Out(cli, "\"%s\"", cli_health(ctx, d));
 	VCLI_Out(cli, ",\n");
 
 	if ((la->p || la->v) && d->vdir->methods->list != NULL) {
 		VCLI_Out(cli, "\"probe_details\": ");
-		d->vdir->methods->list(d, cli->sb, la->p, la->v, 1);
+		d->vdir->methods->list(ctx, d, cli->sb, la->p, la->v, 1);
 	}
 	VCLI_Out(cli, "\"last_change\": %.3f\n", d->vdir->health_changed);
 	VSB_indent(cli->sb, -2);
 	VCLI_Out(cli, "}");
+
+	VCL_Rel_CliCtx(&ctx);
+	AZ(ctx);
+
 	return (0);
 }
 
diff --git a/include/vrt.h b/include/vrt.h
index 9cbf6a6d7..4b547e839 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -60,6 +60,7 @@
  *	changed VRT_blob()
  *	req->req_bodybytes removed
  *	    use: AZ(ObjGetU64(req->wrk, req->body_oc, OA_LEN, &u));
+ *	struct vdi_methods .list callback signature changed
  * 8.0 (2018-09-15)
  *	VRT_Strands() added
  *	VRT_StrandsWS() added
@@ -476,7 +477,7 @@ typedef enum sess_close vdi_http1pipe_f(VRT_CTX, VCL_BACKEND);
 typedef void vdi_event_f(VCL_BACKEND, enum vcl_event_e);
 typedef void vdi_destroy_f(VCL_BACKEND);
 typedef void vdi_panic_f(VCL_BACKEND, struct vsb *);
-typedef void vdi_list_f(VCL_BACKEND, struct vsb *, int, int, int);
+typedef void vdi_list_f(VRT_CTX, VCL_BACKEND, struct vsb *, int, int, int);
 
 struct vdi_methods {
 	unsigned			magic;


More information about the varnish-commit mailing list