[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