[master] 2b01302 Load the vcls and labels into the child process in dependency order.

Poul-Henning Kamp phk at FreeBSD.org
Tue Jan 10 14:28:04 CET 2017


commit 2b013025ddd134e283603c4d78687ac0209159a4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Jan 10 13:26:47 2017 +0000

    Load the vcls and labels into the child process in dependency order.

diff --git a/bin/varnishd/mgt/mgt_vcl.c b/bin/varnishd/mgt/mgt_vcl.c
index adfb7c6..8061634 100644
--- a/bin/varnishd/mgt/mgt_vcl.c
+++ b/bin/varnishd/mgt/mgt_vcl.c
@@ -74,6 +74,7 @@ struct vclprog {
 	VTAILQ_HEAD(, vcldep)	dfrom;
 	VTAILQ_HEAD(, vcldep)	dto;
 	int			nto;
+	int			loaded;
 };
 
 static VTAILQ_HEAD(, vclprog)	vclhead = VTAILQ_HEAD_INITIALIZER(vclhead);
@@ -409,45 +410,46 @@ mgt_push_vcls_and_start(struct cli *cli, unsigned *status, char **p)
 {
 	struct vclprog *vp;
 	struct vcldep *vd;
+	int done;
 
 	AN(active_vcl);
 
 	/* The VCL has not been loaded yet, it cannot fail */
 	AZ(mgt_vcl_setstate(cli, active_vcl, VCL_STATE_WARM));
 
-	VTAILQ_FOREACH(vp, &vclhead, list) {
-		if (!VTAILQ_EMPTY(&vp->dfrom))
-			continue;
-		if (mcf_is_label(vp))
-			continue;
-		if (mgt_cli_askchild(status, p, "vcl.load \"%s\" %s %d%s\n",
-		    vp->name, vp->fname, vp->warm, vp->state))
-			return (1);
-		free(*p);
-		*p = NULL;
-	}
-	VTAILQ_FOREACH(vp, &vclhead, list) {
-		if (!mcf_is_label(vp))
-			continue;
-		vd = VTAILQ_FIRST(&vp->dfrom);
-		AN(vd);
-		if (mgt_cli_askchild(status, p, "vcl.label %s %s\n",
-		    vp->name, vd->to->name))
-			return (1);
-		free(*p);
-		*p = NULL;
-	}
-	VTAILQ_FOREACH(vp, &vclhead, list) {
-		if (VTAILQ_EMPTY(&vp->dfrom))
-			continue;
-		if (mcf_is_label(vp))
-			continue;
-		if (mgt_cli_askchild(status, p, "vcl.load \"%s\" %s %d%s\n",
-		    vp->name, vp->fname, vp->warm, vp->state))
-			return (1);
-		free(*p);
-		*p = NULL;
-	}
+	VTAILQ_FOREACH(vp, &vclhead, list)
+		vp->loaded = 0;
+
+	do {
+		done = 1;
+		VTAILQ_FOREACH(vp, &vclhead, list) {
+			if (vp->loaded)
+				continue;
+			VTAILQ_FOREACH(vd, &vp->dfrom, lfrom)
+				if (!vd->to->loaded)
+					break;
+			if (vd != NULL) {
+				done = 0;
+				continue;
+			}
+			if (mcf_is_label(vp)) {
+				vd = VTAILQ_FIRST(&vp->dfrom);
+				AN(vd);
+				if (mgt_cli_askchild(status, p,
+				    "vcl.label %s %s\n",
+				    vp->name, vd->to->name))
+					return (1);
+			} else {
+				if (mgt_cli_askchild(status, p,
+				    "vcl.load \"%s\" %s %d%s\n",
+				    vp->name, vp->fname, vp->warm, vp->state))
+					return (1);
+			}
+			vp->loaded = 1;
+			free(*p);
+			*p = NULL;
+		}
+	} while(!done);
 
 	if (mgt_cli_askchild(status, p, "vcl.use \"%s\"\n", active_vcl->name))
 		return (1);
diff --git a/bin/varnishtest/tests/r02177.vtc b/bin/varnishtest/tests/r02177.vtc
index 9d4e437..8c10934 100644
--- a/bin/varnishtest/tests/r02177.vtc
+++ b/bin/varnishtest/tests/r02177.vtc
@@ -12,7 +12,7 @@ server s2 {
 
 varnish v1 -vcl {
 	backend s1 { .host="${s1_addr}"; .port="${s1_port}"; }
-} -start
+}
 
 varnish v1 -cli "vcl.label lbl1 vcl1"
 
@@ -44,6 +44,8 @@ varnish v1 -vcl {
 }
 
 varnish v1 -cliok "vcl.list"
+varnish v1 -start
+varnish v1 -cliok "vcl.list"
 
 logexpect l1 -v v1 -g raw {
 	expect * * VCL_Error "Illegal return.vcl.: Not after restarts"



More information about the varnish-commit mailing list