Commit a59d33e4 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

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

parent 5220c394
......@@ -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);
......
......@@ -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);
}
......
......@@ -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 */
......
......@@ -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);
}
......
......@@ -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);
......
......@@ -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);
}
......
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