[master] a59d33e Register all directors&backends, and require them to be so.

Poul-Henning Kamp phk at FreeBSD.org
Fri Apr 27 14:04:25 UTC 2018


commit a59d33e4296246b593d7e3ead97ba817ec53bb21
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri Apr 27 06:58:43 2018 +0000

    Register all directors&backends, and require them to be so.

diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 1171c27..1e17934 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -578,7 +578,7 @@ VBE_Poll(void)
 		if (be->n_conn > 0)
 			continue;
 		Lck_Unlock(&backends_mtx);
-		VRT_DelDirector(NULL, be->director);
+		VRT_DelDirector(be->director);
 		Lck_Lock(&backends_mtx);
 	}
 	Lck_Unlock(&backends_mtx);
diff --git a/bin/varnishd/cache/cache_director.c b/bin/varnishd/cache/cache_director.c
index 7e8b4bc..d93482e 100644
--- a/bin/varnishd/cache/cache_director.c
+++ b/bin/varnishd/cache/cache_director.c
@@ -85,6 +85,7 @@ vdi_resolve(struct busyobj *bo)
 	struct vrt_ctx ctx;
 
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+	CHECK_OBJ_ORNULL(bo->director_req, DIRECTOR_MAGIC);
 
 	INIT_OBJ(&ctx, VRT_CTX_MAGIC);
 	ctx.vcl = bo->vcl;
@@ -100,6 +101,7 @@ vdi_resolve(struct busyobj *bo)
 	for (d = bo->director_req; d != NULL &&
 	    d->methods->resolve != NULL; d = d2) {
 		CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
+		AN(d->vdir);
 		d2 = d->methods->resolve(&ctx, d);
 		if (d2 == NULL)
 			VSLb(bo->vsl, SLT_FetchError,
@@ -108,6 +110,8 @@ vdi_resolve(struct busyobj *bo)
 	CHECK_OBJ_ORNULL(d, DIRECTOR_MAGIC);
 	if (d == NULL)
 		VSLb(bo->vsl, SLT_FetchError, "No backend");
+	else
+		AN(d->vdir);
 	bo->director_resp = d;
 	return (d);
 }
diff --git a/bin/varnishd/cache/cache_director.h b/bin/varnishd/cache/cache_director.h
index 2918bc1..668a3a7 100644
--- a/bin/varnishd/cache/cache_director.h
+++ b/bin/varnishd/cache/cache_director.h
@@ -101,7 +101,7 @@ struct director {
 int VRT_AddDirector(VRT_CTX, struct director *, const char *, ...)
     v_printflike_(3, 4);
 
-void VRT_DelDirector(VRT_CTX, struct director *);
+void VRT_DelDirector(struct director *);
 
 /* cache_director.c */
 
diff --git a/bin/varnishd/cache/cache_vcl_vrt.c b/bin/varnishd/cache/cache_vcl_vrt.c
index 6ef4758..77cf521 100644
--- a/bin/varnishd/cache/cache_vcl_vrt.c
+++ b/bin/varnishd/cache/cache_vcl_vrt.c
@@ -139,7 +139,7 @@ VRT_AddDirector(VRT_CTX, struct director *d, const char *fmt, ...)
 	vcl = ctx->vcl;
 	CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
 	CHECK_OBJ_NOTNULL(d->methods, DIRECTOR_METHODS_MAGIC);
-	AN(d->methods->destroy);
+	// AN(d->methods->destroy);
 
 	AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
 	if (vcl->temp == VCL_TEMP_COOLING) {
@@ -184,12 +184,11 @@ VRT_AddDirector(VRT_CTX, struct director *d, const char *fmt, ...)
 }
 
 void
-VRT_DelDirector(VRT_CTX, struct director *d)
+VRT_DelDirector(struct director *d)
 {
 	struct vcl *vcl;
 	struct vcldir *vdir;
 
-	(void)ctx;
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	vdir = d->vdir;
 	CHECK_OBJ_NOTNULL(vdir, VCLDIR_MAGIC);
@@ -203,9 +202,9 @@ VRT_DelDirector(VRT_CTX, struct director *d)
 	if (VCL_WARM(vcl))
 		VDI_Event(d, VCL_EVENT_COLD);
 	AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
-	AN(d->methods->destroy);
 	REPLACE(d->cli_name, NULL);
-	d->methods->destroy(d);
+	if(d->methods->destroy != NULL)
+		d->methods->destroy(d);
 	FREE_OBJ(vdir);
 }
 
diff --git a/lib/libvmod_directors/vdir.c b/lib/libvmod_directors/vdir.c
index ffecf08..7763486 100644
--- a/lib/libvmod_directors/vdir.c
+++ b/lib/libvmod_directors/vdir.c
@@ -68,9 +68,8 @@ vdir_new(VRT_CTX, struct vdir **vdp, const char *vcl_name,
 	ALLOC_OBJ(vd->dir, DIRECTOR_MAGIC);
 	AN(vd->dir);
 	vd->dir->methods = m;
-	REPLACE(vd->dir->vcl_name, vcl_name);
 	vd->dir->priv = priv;
-	vd->dir->admin_health = VDI_AH_PROBE;
+	AZ(VRT_AddDirector(ctx, vd->dir, "%s", vcl_name));
 	vd->vbm = vbit_new(8);
 	AN(vd->vbm);
 }
@@ -85,7 +84,7 @@ vdir_delete(struct vdir **vdp)
 	free(vd->backend);
 	free(vd->weight);
 	AZ(pthread_rwlock_destroy(&vd->mtx));
-	free(vd->dir->vcl_name);
+	VRT_DelDirector(vd->dir);
 	FREE_OBJ(vd->dir);
 	vbit_destroy(vd->vbm);
 	FREE_OBJ(vd);
diff --git a/lib/libvmod_directors/vmod_shard.c b/lib/libvmod_directors/vmod_shard.c
index b546495..8e39aeb 100644
--- a/lib/libvmod_directors/vmod_shard.c
+++ b/lib/libvmod_directors/vmod_shard.c
@@ -218,10 +218,9 @@ vmod_shard__init(VRT_CTX, struct vmod_directors_shard **vshardp,
 	vshard->param = &shard_param_default;
 	ALLOC_OBJ(vshard->dir, DIRECTOR_MAGIC);
 	AN(vshard->dir);
-	REPLACE(vshard->dir->vcl_name, vcl_name);
 	vshard->dir->priv = vshard;
 	vshard->dir->methods = vmod_shard_methods;
-	vshard->dir->admin_health = VDI_AH_HEALTHY;
+	AZ(VRT_AddDirector(ctx, vshard->dir, "%s", vcl_name));
 }
 
 VCL_VOID v_matchproto_(td_directors_shard__fini)
@@ -232,7 +231,7 @@ vmod_shard__fini(struct vmod_directors_shard **vshardp)
 	*vshardp = NULL;
 	CHECK_OBJ_NOTNULL(vshard, VMOD_SHARD_SHARD_MAGIC);
 	sharddir_delete(&vshard->shardd);
-	free(vshard->dir->vcl_name);
+	VRT_DelDirector(vshard->dir);
 	FREE_OBJ(vshard->dir);
 	FREE_OBJ(vshard);
 }


More information about the varnish-commit mailing list