[master] 0cdfda9 Now that directors are in VMODs and VCL_BACKEND is a bona fide VCL type, we can simplify the VCC backend code somewhat.
Poul-Henning Kamp
phk at varnish-cache.org
Wed Sep 11 08:05:10 CEST 2013
commit 0cdfda9387e93b7fcb02f3db5cf4d282b1e06524
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Sep 11 06:04:26 2013 +0000
Now that directors are in VMODs and VCL_BACKEND is a bona fide
VCL type, we can simplify the VCC backend code somewhat.
diff --git a/lib/libvcl/vcc_backend.c b/lib/libvcl/vcc_backend.c
index 1f95772..95e934e 100644
--- a/lib/libvcl/vcc_backend.c
+++ b/lib/libvcl/vcc_backend.c
@@ -26,26 +26,6 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * A necessary explanation of a convoluted policy:
- *
- * In VCL we have backends and directors.
- *
- * In VRT we have directors which reference (a number of) backend hosts.
- *
- * A VCL backend therefore has an implicit director of type "simple" created
- * by the compiler, but not visible in VCL.
- *
- * A VCL backend is a "named host", these can be referenced by name from
- * VCL directors, but not from VCL backends.
- *
- * The reason for this quasimadness is that we want to collect statistics
- * for each actual kickable hardware backend machine, but we want to be
- * able to refer to them multiple times in different directors.
- *
- * At the same time, we do not want to force users to declare each backend
- * host with a name, if all they want to do is put it into a director, so
- * backend hosts can be declared inline in the director, in which case
- * its identity is the director and its numerical index therein.
*/
#include "config.h"
@@ -57,13 +37,6 @@
#include "vss.h"
-struct host {
- VTAILQ_ENTRY(host) list;
- struct token *name;
- char *vgcname;
-};
-
-
/*--------------------------------------------------------------------
* Struct sockaddr is not really designed to be a compile time
* initialized data structure, so we encode it as a byte-string
@@ -293,7 +266,7 @@ vcc_ParseProbe(struct vcc *tl)
*/
static void
-vcc_ParseHostDef(struct vcc *tl, int serial, const char *vgcname)
+vcc_ParseHostDef(struct vcc *tl, const struct token *t_be)
{
struct token *t_field;
struct token *t_host = NULL;
@@ -303,6 +276,9 @@ vcc_ParseHostDef(struct vcc *tl, int serial, const char *vgcname)
struct vsb *vsb;
unsigned u;
double t;
+ char vgcname[MAX_BACKEND_NAME + 8];
+
+ sprintf(vgcname, "_%.*s", PF(t_be));
Fh(tl, 1, "\n#define VGC_backend_%s %d\n", vgcname, tl->ndirector);
@@ -326,9 +302,7 @@ vcc_ParseHostDef(struct vcc *tl, int serial, const char *vgcname)
Fb(tl, 0, "\nstatic const struct vrt_backend vgc_dir_priv_%s = {\n",
vgcname);
- Fb(tl, 0, "\t.vcl_name = \"%.*s", PF(tl->t_dir));
- if (serial >= 0)
- Fb(tl, 0, "[%d]", serial);
+ Fb(tl, 0, "\t.vcl_name = \"%.*s", PF(t_be));
Fb(tl, 0, "\",\n");
/* Check for old syntax */
@@ -451,85 +425,51 @@ vcc_ParseHostDef(struct vcc *tl, int serial, const char *vgcname)
}
/*--------------------------------------------------------------------
- * Tell rest of compiler about a backend
- */
-
-static void
-vcc_DefBackend(struct vcc *tl, const struct token *nm)
-{
- struct symbol *sym;
-
- sym = VCC_GetSymbolTok(tl, nm, SYM_BACKEND);
- AN(sym);
- if (sym->ndef > 0) {
- VSB_printf(tl->sb, "Backend %.*s redefined\n", PF(nm));
- vcc_ErrWhere(tl, nm);
- return;
- }
- sym->fmt = BACKEND;
- sym->eval = vcc_Eval_Backend;
- sym->ndef++;
-}
-
-/*--------------------------------------------------------------------
- * Parse a plain backend aka a simple director
- */
-
-static void
-vcc_ParseSimpleDirector(struct vcc *tl)
-{
- struct host *h;
- char vgcname[BUFSIZ];
-
- h = TlAlloc(tl, sizeof *h);
- h->name = tl->t_dir;
- vcc_DefBackend(tl, tl->t_dir);
- ERRCHK(tl);
- sprintf(vgcname, "_%.*s", PF(h->name));
- h->vgcname = TlAlloc(tl, strlen(vgcname) + 1);
- strcpy(h->vgcname, vgcname);
-
- vcc_ParseHostDef(tl, -1, vgcname);
- ERRCHK(tl);
-
- VTAILQ_INSERT_TAIL(&tl->hosts, h, list);
-}
-
-/*--------------------------------------------------------------------
* Parse directors and backends
*/
void
-vcc_ParseDirector(struct vcc *tl)
+vcc_ParseBackend(struct vcc *tl)
{
- struct token *t_first;
+ struct token *t_first, *t_be;
int isfirst;
+ struct symbol *sym;
t_first = tl->t;
- vcc_NextToken(tl); /* ID: director | backend */
+ vcc_NextToken(tl); /* ID: backend */
vcc_ExpectCid(tl); /* ID: name */
ERRCHK(tl);
- if (tl->t->e - tl->t->b > 64) {
+
+ if (tl->t->e - tl->t->b > MAX_BACKEND_NAME) {
VSB_printf(tl->sb,
- "Name of %.*s too long (max 64, is %zu):\n",
- PF(t_first), (size_t)(tl->t->e - tl->t->b));
+ "Name of %.*s too long (max %d, is %zu):\n",
+ PF(t_first), MAX_BACKEND_NAME,
+ (size_t)(tl->t->e - tl->t->b));
vcc_ErrWhere(tl, tl->t);
return;
}
- tl->t_dir = tl->t;
- vcc_NextToken(tl);
+ t_be = tl->t;
+ vcc_NextToken(tl);
isfirst = tl->ndirector;
- if (vcc_IdIs(t_first, "backend")) {
- vcc_ParseSimpleDirector(tl);
- } else {
- VSB_printf(tl->sb,
- "\ndirectors are now in VMOD.directors\n");
- vcc_ErrWhere(tl, t_first);
+
+ sym = VCC_GetSymbolTok(tl, t_be, SYM_BACKEND);
+ AN(sym);
+ if (sym->ndef > 0) {
+ VSB_printf(tl->sb, "Backend %.*s redefined\n", PF(t_be));
+ vcc_ErrWhere(tl, t_be);
return;
}
+ sym->fmt = BACKEND;
+ sym->eval = vcc_Eval_Backend;
+ sym->ndef++;
+ ERRCHK(tl);
+
+ vcc_ParseHostDef(tl, t_be);
+ ERRCHK(tl);
+
if (tl->err) {
VSB_printf(tl->sb,
"\nIn %.*s specification starting at:\n", PF(t_first));
@@ -537,10 +477,8 @@ vcc_ParseDirector(struct vcc *tl)
return;
}
- if (isfirst == 1 || vcc_IdIs(tl->t_dir, "default")) {
+ if (isfirst == 1 || vcc_IdIs(t_be, "default")) {
tl->defaultdir = tl->ndirector - 1;
- tl->t_defaultdir = tl->t_dir;
+ tl->t_defaultdir = t_be;
}
-
- tl->t_dir = NULL;
}
diff --git a/lib/libvcl/vcc_compile.c b/lib/libvcl/vcc_compile.c
index c34ffc4..eeb392c 100644
--- a/lib/libvcl/vcc_compile.c
+++ b/lib/libvcl/vcc_compile.c
@@ -517,7 +517,6 @@ vcc_NewVcc(const struct vcc *tl0)
tl->err_unref = 1;
}
VTAILQ_INIT(&tl->symbols);
- VTAILQ_INIT(&tl->hosts);
VTAILQ_INIT(&tl->membits);
VTAILQ_INIT(&tl->tokens);
VTAILQ_INIT(&tl->sources);
diff --git a/lib/libvcl/vcc_compile.h b/lib/libvcl/vcc_compile.h
index 1b6da33..65401df 100644
--- a/lib/libvcl/vcc_compile.h
+++ b/lib/libvcl/vcc_compile.h
@@ -160,7 +160,6 @@ struct vcc {
struct tokenhead tokens;
VTAILQ_HEAD(, source) sources;
VTAILQ_HEAD(, membit) membits;
- VTAILQ_HEAD(, host) hosts;
unsigned nsources;
struct source *src;
struct token *t;
@@ -191,7 +190,6 @@ struct vcc {
int defaultdir;
struct token *t_defaultdir;
- struct token *t_dir;
unsigned unique;
unsigned nvmodpriv;
@@ -228,10 +226,11 @@ void vcc_Acl_Hack(struct vcc *tl, char *b);
int vcc_ParseAction(struct vcc *tl);
/* vcc_backend.c */
+#define MAX_BACKEND_NAME 64
struct fld_spec;
void vcc_ParseProbe(struct vcc *tl);
-void vcc_ParseDirector(struct vcc *tl);
+void vcc_ParseBackend(struct vcc *tl);
struct fld_spec * vcc_FldSpec(struct vcc *tl, const char *first, ...);
void vcc_IsField(struct vcc *tl, struct token **t, struct fld_spec *fs);
void vcc_FieldsOk(struct vcc *tl, const struct fld_spec *fs);
diff --git a/lib/libvcl/vcc_parse.c b/lib/libvcl/vcc_parse.c
index e334846..abe07ee 100644
--- a/lib/libvcl/vcc_parse.c
+++ b/lib/libvcl/vcc_parse.c
@@ -274,6 +274,16 @@ vcc_Function(struct vcc *tl)
}
/*--------------------------------------------------------------------
+ */
+
+static void
+vcc_Director(struct vcc *tl)
+{
+ VSB_printf(tl->sb, "\ndirectors are now in directors VMOD.\n");
+ vcc_ErrWhere(tl, tl->t);
+}
+
+/*--------------------------------------------------------------------
* Top level of parser, recognize:
* Inline C-code
* ACL definitions
@@ -290,8 +300,8 @@ static struct toplev {
} toplev[] = {
{ "acl", vcc_Acl },
{ "sub", vcc_Function },
- { "backend", vcc_ParseDirector },
- { "director", vcc_ParseDirector },
+ { "backend", vcc_ParseBackend },
+ { "director", vcc_Director },
{ "probe", vcc_ParseProbe },
{ "import", vcc_ParseImport },
{ NULL, NULL }
More information about the varnish-commit
mailing list