Commit 37abc301 authored by Dridi Boukelmoune's avatar Dridi Boukelmoune Committed by Lasse Karstensen

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.
parent 83e5fc59
......@@ -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]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment