[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