[master] c67cb24 Wrap VCL event calls in dedicated functions
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Mon Jan 11 11:52:34 CET 2016
commit c67cb243ae3e29cbecf48e1f42f0e12206e417d3
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date: Thu Dec 10 11:44:05 2015 +0100
Wrap VCL event calls in dedicated functions
The two functions are separated in order to have self-documenting
signatures because one class of events is (or will be) allowed to
fail while the other MUST be failsafe.
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index e19c9ce..b1b7756 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -428,6 +428,35 @@ vcl_find(const char *name)
return (NULL);
}
+static int
+vcl_setup_event(VRT_CTX, enum vcl_event_e ev)
+{
+
+ CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+ AN(ctx->handling);
+ AN(ctx->vcl);
+ assert(ev == VCL_EVENT_LOAD || ev == VCL_EVENT_WARM ||
+ ev == VCL_EVENT_USE);
+
+ if (ev == VCL_EVENT_LOAD)
+ AN(ctx->msg);
+
+ return (ctx->vcl->conf->event_vcl(ctx, ev));
+}
+
+static void
+vcl_failsafe_event(VRT_CTX, enum vcl_event_e ev)
+{
+
+ CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+ AN(ctx->handling);
+ AN(ctx->vcl);
+ assert(ev == VCL_EVENT_COLD || ev == VCL_EVENT_DISCARD);
+
+ if (ctx->vcl->conf->event_vcl(ctx, ev) != 0)
+ WRONG("A VMOD cannot fail COLD or DISCARD events");
+}
+
static void
vcl_set_state(VRT_CTX, const char *state)
{
@@ -448,7 +477,7 @@ vcl_set_state(VRT_CTX, const char *state)
vcl->temp = vcl->refcount ? VCL_TEMP_COOLING :
VCL_TEMP_COLD;
- AZ(vcl->conf->event_vcl(ctx, VCL_EVENT_COLD));
+ vcl_failsafe_event(ctx, VCL_EVENT_COLD);
vcl_BackendEvent(vcl, VCL_EVENT_COLD);
}
else if (vcl->busy)
@@ -465,7 +494,7 @@ vcl_set_state(VRT_CTX, const char *state)
/* The VCL must first reach a stable cold state */
else if (vcl->temp != VCL_TEMP_COOLING) {
vcl->temp = VCL_TEMP_WARM;
- (void)vcl->conf->event_vcl(ctx, VCL_EVENT_WARM);
+ (void)vcl_setup_event(ctx, VCL_EVENT_WARM);
vcl_BackendEvent(vcl, VCL_EVENT_WARM);
}
break;
@@ -515,13 +544,13 @@ VCL_Load(struct cli *cli, const char *name, const char *fn, const char *state)
VSB_clear(vsb);
ctx.msg = vsb;
- i = vcl->conf->event_vcl(&ctx, VCL_EVENT_LOAD);
+ i = vcl_setup_event(&ctx, VCL_EVENT_LOAD);
AZ(VSB_finish(vsb));
if (i) {
VCLI_Out(cli, "VCL \"%s\" Failed initialization", name);
if (VSB_len(vsb))
VCLI_Out(cli, "\nMessage:\n\t%s", VSB_data(vsb));
- AZ(vcl->conf->event_vcl(&ctx, VCL_EVENT_DISCARD));
+ vcl_failsafe_event(&ctx, VCL_EVENT_DISCARD);
vcl_KillBackends(vcl);
VCL_Close(&vcl);
VSB_delete(vsb);
@@ -563,7 +592,7 @@ VCL_Nuke(struct vcl *vcl)
ctx.method = VCL_MET_FINI;
ctx.handling = &hand;
ctx.vcl = vcl;
- AZ(vcl->conf->event_vcl(&ctx, VCL_EVENT_DISCARD));
+ vcl_failsafe_event(&ctx, VCL_EVENT_DISCARD);
vcl_KillBackends(vcl);
free(vcl->loaded_name);
VCL_Close(&vcl);
@@ -688,7 +717,7 @@ ccf_config_use(struct cli *cli, const char * const *av, void *priv)
AN(vsb);
ctx.msg = vsb;
ctx.vcl = vcl;
- i = vcl->conf->event_vcl(&ctx, VCL_EVENT_USE);
+ i = vcl_setup_event(&ctx, VCL_EVENT_USE);
AZ(VSB_finish(vsb));
if (i) {
VCLI_Out(cli, "VCL \"%s\" Failed to activate", av[2]);
More information about the varnish-commit
mailing list