Commit 2f869e04 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Allocate the director structure centrally

parent 4d568263
......@@ -453,11 +453,8 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
const struct vrt_backend *vrt)
{
struct backend *be;
struct director *d;
VCL_BACKEND bb;
struct vcl *vcl;
const struct vrt_backend_probe *vbp;
int retval;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(vrt, VRT_BACKEND_MAGIC);
......@@ -483,19 +480,15 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
#undef DA
#undef DN
d = be->director;
INIT_OBJ(d, DIRECTOR_MAGIC);
d->priv = be;
d->methods = vbe_methods;
be->vsc = VSC_vbe_New(vc, &be->vsc_seg,
"%s.%s", VCL_Name(ctx->vcl), vrt->vcl_name);
AN(be->vsc);
retval = VRT_AddDirector(ctx, d, "%s", vrt->vcl_name);
if (retval) {
bb = d;
VRT_delete_backend(ctx, &bb);
be->director = VRT_AddDirector(ctx, vbe_methods, be,
"%s", vrt->vcl_name);
if (be->director == NULL) {
// XXX
VRT_delete_backend(ctx, &be->director);
return (NULL);
}
......@@ -515,7 +508,7 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
VBP_Insert(be, vbp, be->tcp_pool);
}
return (d);
return (be->director);
}
VCL_BACKEND v_matchproto_()
......@@ -579,7 +572,7 @@ VBE_Poll(void)
if (be->n_conn > 0)
continue;
Lck_Unlock(&backends_mtx);
VRT_DelDirector(be->director);
VRT_DelDirector(&be->director);
Lck_Lock(&backends_mtx);
}
Lck_Unlock(&backends_mtx);
......
......@@ -64,7 +64,7 @@ struct backend {
struct tcp_pool *tcp_pool;
struct director director[1];
VCL_BACKEND director;
double cooled;
};
......
......@@ -172,19 +172,15 @@ vbp_update_backend(struct vbp_target *vt)
logmsg = "Still healthy";
} else {
logmsg = "Back healthy";
vt->backend->director->health_changed =
VTIM_real();
VRT_SetHealth(vt->backend->director, 1);
}
VRT_SetHealth(vt->backend->director, 1);
} else {
if (vt->backend->director->health) {
logmsg = "Went sick";
vt->backend->director->health_changed =
VTIM_real();
VRT_SetHealth(vt->backend->director, 0);
} else {
logmsg = "Still sick";
}
VRT_SetHealth(vt->backend->director, 0);
}
VSL(SLT_Backend_health, 0, "%s %s %s %u %u %u %.6f %.6f %s",
vt->backend->director->cli_name, logmsg, bits,
......
......@@ -83,7 +83,6 @@ struct director {
char *vcl_name;
void *priv;
const void *priv2;
/* Internal Housekeeping fields */
......@@ -98,12 +97,12 @@ struct director {
/* cache_vcl.c */
int VRT_AddDirector(VRT_CTX, struct director *, const char *, ...)
v_printflike_(3, 4);
VCL_BACKEND VRT_AddDirector(VRT_CTX, const struct director_methods *,
void *, const char *, ...) v_printflike_(4, 5);
void VRT_SetHealth(VCL_BACKEND d, int health);
void VRT_DisableDirector(VCL_BACKEND);
void VRT_DelDirector(struct director *);
void VRT_DelDirector(VCL_BACKEND *);
/* cache_director.c */
......
......@@ -126,27 +126,32 @@ VCL_Rel(struct vcl **vcc)
/*--------------------------------------------------------------------*/
int
VRT_AddDirector(VRT_CTX, struct director *d, const char *fmt, ...)
VCL_BACKEND
VRT_AddDirector(VRT_CTX, const struct director_methods *m, void *priv,
const char *fmt, ...)
{
struct vsb *vsb;
struct vcl *vcl;
struct vcldir *vdir;
struct director *d;
va_list ap;
int i;
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(m, DIRECTOR_METHODS_MAGIC);
AN(fmt);
vcl = ctx->vcl;
CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
CHECK_OBJ_NOTNULL(d->methods, DIRECTOR_METHODS_MAGIC);
// AN(d->methods->destroy);
AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
if (vcl->temp == VCL_TEMP_COOLING) {
AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
return (1);
return (NULL);
}
ALLOC_OBJ(d, DIRECTOR_MAGIC);
AN(d);
d->methods = m;
d->priv = priv;
d->admin_health = VDI_AH_PROBE;
vsb = VSB_new_auto();
AN(vsb);
......@@ -180,16 +185,17 @@ VRT_AddDirector(VRT_CTX, struct director *d, const char *fmt, ...)
WRONG("Dynamic Backends can only be added to warm VCLs");
AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
return (0);
return (d);
}
void
VRT_DelDirector(struct director *d)
VRT_DelDirector(VCL_BACKEND *bp)
{
struct vcl *vcl;
struct vcldir *vdir;
VCL_BACKEND d;
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
TAKE_OBJ_NOTNULL(d, bp, DIRECTOR_MAGIC);
vdir = d->vdir;
CHECK_OBJ_NOTNULL(vdir, VCLDIR_MAGIC);
vcl = vdir->vcl;
......@@ -202,9 +208,10 @@ VRT_DelDirector(struct director *d)
if (VCL_WARM(vcl))
VDI_Event(d, VCL_EVENT_COLD);
AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
REPLACE(d->cli_name, NULL);
if(d->methods->destroy != NULL)
d->methods->destroy(d);
free(d->cli_name);
FREE_OBJ(vdir->dir);
FREE_OBJ(vdir);
}
......@@ -218,6 +225,7 @@ VRT_SetHealth(VCL_BACKEND d, int health)
CHECK_OBJ_NOTNULL(vdir, VCLDIR_MAGIC);
vdir->dir->health = health;
vdir->dir->health_changed = VTIM_real();
}
void
......
......@@ -94,6 +94,7 @@
+libh mgt_event.h
-sem(VRT_AddDirector, custodial(3))
-sem(VCP_New, custodial(3))
-sem(vsmw_addseg, custodial(2))
-sem(BAN_Free, custodial(1))
......
......@@ -64,12 +64,7 @@ vdir_new(VRT_CTX, struct vdir **vdp, const char *vcl_name,
AN(vd);
*vdp = vd;
AZ(pthread_rwlock_init(&vd->mtx, NULL));
ALLOC_OBJ(vd->dir, DIRECTOR_MAGIC);
AN(vd->dir);
vd->dir->methods = m;
vd->dir->priv = priv;
AZ(VRT_AddDirector(ctx, vd->dir, "%s", vcl_name));
vd->dir = VRT_AddDirector(ctx, m, priv, "%s", vcl_name);
vd->vbm = vbit_new(8);
AN(vd->vbm);
}
......@@ -84,8 +79,7 @@ vdir_delete(struct vdir **vdp)
free(vd->backend);
free(vd->weight);
AZ(pthread_rwlock_destroy(&vd->mtx));
VRT_DelDirector(vd->dir);
FREE_OBJ(vd->dir);
VRT_DelDirector(&vd->dir);
vbit_destroy(vd->vbm);
FREE_OBJ(vd);
}
......
......@@ -37,7 +37,7 @@ struct vdir {
VCL_BACKEND *backend;
double *weight;
double total_weight;
struct director *dir;
VCL_BACKEND dir;
struct vbitmap *vbm;
};
......
......@@ -91,7 +91,7 @@ struct vmod_directors_shard_param {
enum healthy_e healthy;
uint32_t mask;
VCL_BOOL rampup;
VCL_INT alt;
VCL_INT alt;
VCL_REAL warmup;
};
......@@ -137,7 +137,7 @@ struct vmod_directors_shard {
unsigned magic;
#define VMOD_SHARD_SHARD_MAGIC 0x6e63e1bf
struct sharddir *shardd;
struct director *dir;
VCL_BACKEND dir;
const struct vmod_directors_shard_param *param;
};
......@@ -216,11 +216,8 @@ vmod_shard__init(VRT_CTX, struct vmod_directors_shard **vshardp,
sharddir_new(&vshard->shardd, vcl_name);
vshard->param = &shard_param_default;
ALLOC_OBJ(vshard->dir, DIRECTOR_MAGIC);
AN(vshard->dir);
vshard->dir->priv = vshard;
vshard->dir->methods = vmod_shard_methods;
AZ(VRT_AddDirector(ctx, vshard->dir, "%s", vcl_name));
vshard->dir =
VRT_AddDirector(ctx, vmod_shard_methods, vshard, "%s", vcl_name);
}
VCL_VOID v_matchproto_(td_directors_shard__fini)
......@@ -231,8 +228,7 @@ vmod_shard__fini(struct vmod_directors_shard **vshardp)
*vshardp = NULL;
CHECK_OBJ_NOTNULL(vshard, VMOD_SHARD_SHARD_MAGIC);
sharddir_delete(&vshard->shardd);
VRT_DelDirector(vshard->dir);
FREE_OBJ(vshard->dir);
VRT_DelDirector(&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