[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