[master] f4895da Split VCL event sender functions out individually.
Poul-Henning Kamp
phk at FreeBSD.org
Mon Jan 11 15:54:18 CET 2016
commit f4895da5b08b83c2190ff96e2a6364e4699e962f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Jan 11 14:53:48 2016 +0000
Split VCL event sender functions out individually.
Dridi: Not XXX comments
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index b1b7756..5856f3c 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -411,50 +411,75 @@ VRT_rel_vcl(VRT_CTX)
Lck_Unlock(&vcl_mtx);
}
-/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------
+ * Wrapper functions to send events to VCL and guarantee semantics.
+ */
-static struct vcl *
-vcl_find(const char *name)
+static int
+vcl_event_load(VRT_CTX)
{
- struct vcl *vcl;
-
- ASSERT_CLI();
- VTAILQ_FOREACH(vcl, &vcl_head, list) {
- if (vcl->discard)
- continue;
- if (!strcmp(vcl->loaded_name, name))
- return (vcl);
- }
- return (NULL);
+ CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+ AN(ctx->handling);
+ AN(ctx->vcl);
+ AN(ctx->msg);
+ return (ctx->vcl->conf->event_vcl(ctx, VCL_EVENT_LOAD));
}
static int
-vcl_setup_event(VRT_CTX, enum vcl_event_e ev)
+vcl_event_warm(VRT_CTX)
{
-
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);
+ // AN/AZ(ctx->msg); // XXX: Dridi: which is it ?
+ return (ctx->vcl->conf->event_vcl(ctx, VCL_EVENT_WARM));
+}
- return (ctx->vcl->conf->event_vcl(ctx, ev));
+static int
+vcl_event_use(VRT_CTX)
+{
+ CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+ AN(ctx->handling);
+ AN(ctx->vcl);
+ AN(ctx->msg);
+ return (ctx->vcl->conf->event_vcl(ctx, VCL_EVENT_USE));
}
static void
-vcl_failsafe_event(VRT_CTX, enum vcl_event_e ev)
+vcl_event_cold(VRT_CTX)
{
+ CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+ AN(ctx->handling);
+ AN(ctx->vcl);
+ AZ(ctx->msg);
+ AZ(ctx->vcl->conf->event_vcl(ctx, VCL_EVENT_COLD));
+}
+static void
+vcl_event_discard(VRT_CTX)
+{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
AN(ctx->handling);
AN(ctx->vcl);
- assert(ev == VCL_EVENT_COLD || ev == VCL_EVENT_DISCARD);
+ // AN/AZ(ctx->msg); // XXX: Dridi: which is it ?
+ AZ(ctx->vcl->conf->event_vcl(ctx, VCL_EVENT_DISCARD));
+}
+
+/*--------------------------------------------------------------------*/
+
+static struct vcl *
+vcl_find(const char *name)
+{
+ struct vcl *vcl;
- if (ctx->vcl->conf->event_vcl(ctx, ev) != 0)
- WRONG("A VMOD cannot fail COLD or DISCARD events");
+ ASSERT_CLI();
+ VTAILQ_FOREACH(vcl, &vcl_head, list) {
+ if (vcl->discard)
+ continue;
+ if (!strcmp(vcl->loaded_name, name))
+ return (vcl);
+ }
+ return (NULL);
}
static void
@@ -477,7 +502,7 @@ vcl_set_state(VRT_CTX, const char *state)
vcl->temp = vcl->refcount ? VCL_TEMP_COOLING :
VCL_TEMP_COLD;
- vcl_failsafe_event(ctx, VCL_EVENT_COLD);
+ vcl_event_cold(ctx);
vcl_BackendEvent(vcl, VCL_EVENT_COLD);
}
else if (vcl->busy)
@@ -494,7 +519,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_setup_event(ctx, VCL_EVENT_WARM);
+ vcl_event_warm(ctx); // XXX: Dridi: what if it fails?
vcl_BackendEvent(vcl, VCL_EVENT_WARM);
}
break;
@@ -544,13 +569,13 @@ VCL_Load(struct cli *cli, const char *name, const char *fn, const char *state)
VSB_clear(vsb);
ctx.msg = vsb;
- i = vcl_setup_event(&ctx, VCL_EVENT_LOAD);
+ i = vcl_event_load(&ctx);
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));
- vcl_failsafe_event(&ctx, VCL_EVENT_DISCARD);
+ vcl_event_discard(&ctx);
vcl_KillBackends(vcl);
VCL_Close(&vcl);
VSB_delete(vsb);
@@ -592,7 +617,7 @@ VCL_Nuke(struct vcl *vcl)
ctx.method = VCL_MET_FINI;
ctx.handling = &hand;
ctx.vcl = vcl;
- vcl_failsafe_event(&ctx, VCL_EVENT_DISCARD);
+ vcl_event_discard(&ctx);
vcl_KillBackends(vcl);
free(vcl->loaded_name);
VCL_Close(&vcl);
@@ -717,7 +742,7 @@ ccf_config_use(struct cli *cli, const char * const *av, void *priv)
AN(vsb);
ctx.msg = vsb;
ctx.vcl = vcl;
- i = vcl_setup_event(&ctx, VCL_EVENT_USE);
+ i = vcl_event_use(&ctx);
AZ(VSB_finish(vsb));
if (i) {
VCLI_Out(cli, "VCL \"%s\" Failed to activate", av[2]);
More information about the varnish-commit
mailing list