[master] 1c7294c92 cli: Split vcl.discard in two

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Mon Nov 23 05:15:15 UTC 2020


commit 1c7294c921fe3549692f745eebe7fc655e53b1c2
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Mon Oct 12 11:49:32 2020 +0200

    cli: Split vcl.discard in two
    
    The first operation consists in checking the ability to discard the
    requested VCL, the second part effectively performs the VCL deletion.

diff --git a/bin/varnishd/mgt/mgt_vcl.c b/bin/varnishd/mgt/mgt_vcl.c
index 359877aa4..4b5f907d0 100644
--- a/bin/varnishd/mgt/mgt_vcl.c
+++ b/bin/varnishd/mgt/mgt_vcl.c
@@ -653,43 +653,16 @@ mcf_vcl_use(struct cli *cli, const char * const *av, void *priv)
 	free(p);
 }
 
-static void v_matchproto_(cli_func_t)
-mcf_vcl_discard(struct cli *cli, const char * const *av, void *priv)
+static void
+mgt_vcl_discard(struct cli *cli, struct vclprog *vp)
 {
-	unsigned status;
 	char *p = NULL;
-	struct vclprog *vp;
-	struct vcldep *vd;
-	int n;
+	unsigned status;
+
+	AN(vp);
+	assert(vp != active_vcl);
+	assert(VTAILQ_EMPTY(&vp->dto));
 
-	(void)priv;
-	vp = mcf_find_vcl(cli, av[2]);
-	if (vp == NULL)
-		return;
-	if (vp == active_vcl) {
-		VCLI_SetResult(cli, CLIS_CANT);
-		VCLI_Out(cli, "Cannot discard active VCL program\n");
-		return;
-	}
-	if (!VTAILQ_EMPTY(&vp->dto)) {
-		VCLI_SetResult(cli, CLIS_CANT);
-		AN(vp->warm);
-		if (!mcf_is_label(vp))
-			VCLI_Out(cli, "Cannot discard labeled VCL program.\n");
-		else
-			VCLI_Out(cli,
-			    "Cannot discard this VCL label, "
-			    "other VCLs depend on it.\n");
-		n = 0;
-		VTAILQ_FOREACH(vd, &vp->dto, lto) {
-			if (n++ == 5) {
-				VCLI_Out(cli, "\t[...]");
-				break;
-			}
-			VCLI_Out(cli, "\t%s\n", vd->from->name);
-		}
-		return;
-	}
 	if (mcf_is_label(vp)) {
 		AN(vp->warm);
 		vp->warm = 0;
@@ -698,13 +671,66 @@ mcf_vcl_discard(struct cli *cli, const char * const *av, void *priv)
 	}
 	if (MCH_Running()) {
 		AZ(vp->warm);
-		if (mgt_cli_askchild(&status, &p, "vcl.discard %s\n", av[2]))
+		if (mgt_cli_askchild(&status, &p, "vcl.discard %s\n", vp->name))
 			assert(status == CLIS_OK || status == CLIS_COMMS);
 		free(p);
 	}
 	mgt_vcl_del(vp);
 }
 
+static struct vclprog *
+mgt_vcl_can_discard(struct cli *cli, const char * const *av)
+{
+	struct vclprog *vp;
+	struct vcldep *vd;
+	int n;
+
+	AN(cli);
+	AN(av);
+	AN(*av);
+
+	vp = mcf_find_vcl(cli, *av);
+	if (vp == NULL)
+		return (NULL);
+	if (vp == active_vcl) {
+		VCLI_SetResult(cli, CLIS_CANT);
+		VCLI_Out(cli, "Cannot discard active VCL program\n");
+		return (NULL);
+	}
+	if (VTAILQ_EMPTY(&vp->dto))
+		return (vp);
+
+	VCLI_SetResult(cli, CLIS_CANT);
+	AN(vp->warm);
+	if (!mcf_is_label(vp))
+		VCLI_Out(cli, "Cannot discard labeled VCL program.\n");
+	else
+		VCLI_Out(cli,
+		    "Cannot discard this VCL label, "
+		    "other VCLs depend on it.\n");
+	n = 0;
+	VTAILQ_FOREACH(vd, &vp->dto, lto) {
+		if (n++ == 5) {
+			VCLI_Out(cli, "\t[...]");
+			break;
+		}
+		VCLI_Out(cli, "\t%s\n", vd->from->name);
+	}
+	return (NULL);
+}
+
+static void v_matchproto_(cli_func_t)
+mcf_vcl_discard(struct cli *cli, const char * const *av, void *priv)
+{
+	struct vclprog *vp;
+
+	(void)priv;
+	vp = mgt_vcl_can_discard(cli, av + 2);
+	if (vp == NULL)
+		return;
+	mgt_vcl_discard(cli, vp);
+}
+
 static void v_matchproto_(cli_func_t)
 mcf_vcl_list(struct cli *cli, const char * const *av, void *priv)
 {


More information about the varnish-commit mailing list