[master] 2f869e0 Allocate the director structure centrally
Poul-Henning Kamp
phk at FreeBSD.org
Fri Apr 27 14:04:26 UTC 2018
commit 2f869e04f619bfdce3249812271b082c1d2ec9ff
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Fri Apr 27 09:10:12 2018 +0000
Allocate the director structure centrally
diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 18cd2ff..fcd48cb 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -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);
diff --git a/bin/varnishd/cache/cache_backend.h b/bin/varnishd/cache/cache_backend.h
index 5f8eca1..1872c70 100644
--- a/bin/varnishd/cache/cache_backend.h
+++ b/bin/varnishd/cache/cache_backend.h
@@ -64,7 +64,7 @@ struct backend {
struct tcp_pool *tcp_pool;
- struct director director[1];
+ VCL_BACKEND director;
double cooled;
};
diff --git a/bin/varnishd/cache/cache_backend_probe.c b/bin/varnishd/cache/cache_backend_probe.c
index 7e17793..dbf0520 100644
--- a/bin/varnishd/cache/cache_backend_probe.c
+++ b/bin/varnishd/cache/cache_backend_probe.c
@@ -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,
diff --git a/bin/varnishd/cache/cache_director.h b/bin/varnishd/cache/cache_director.h
index 6a84263..7cce8cf 100644
--- a/bin/varnishd/cache/cache_director.h
+++ b/bin/varnishd/cache/cache_director.h
@@ -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 */
diff --git a/bin/varnishd/cache/cache_vcl_vrt.c b/bin/varnishd/cache/cache_vcl_vrt.c
index 815f048..6e45c9f 100644
--- a/bin/varnishd/cache/cache_vcl_vrt.c
+++ b/bin/varnishd/cache/cache_vcl_vrt.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
diff --git a/bin/varnishd/flint.lnt b/bin/varnishd/flint.lnt
index 8ec868d..4664df7 100644
--- a/bin/varnishd/flint.lnt
+++ b/bin/varnishd/flint.lnt
@@ -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))
diff --git a/lib/libvmod_directors/vdir.c b/lib/libvmod_directors/vdir.c
index 7763486..226e060 100644
--- a/lib/libvmod_directors/vdir.c
+++ b/lib/libvmod_directors/vdir.c
@@ -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);
}
diff --git a/lib/libvmod_directors/vdir.h b/lib/libvmod_directors/vdir.h
index 6c8331d..5531931 100644
--- a/lib/libvmod_directors/vdir.h
+++ b/lib/libvmod_directors/vdir.h
@@ -37,7 +37,7 @@ struct vdir {
VCL_BACKEND *backend;
double *weight;
double total_weight;
- struct director *dir;
+ VCL_BACKEND dir;
struct vbitmap *vbm;
};
diff --git a/lib/libvmod_directors/vmod_shard.c b/lib/libvmod_directors/vmod_shard.c
index 8e39aeb..a470c6e 100644
--- a/lib/libvmod_directors/vmod_shard.c
+++ b/lib/libvmod_directors/vmod_shard.c
@@ -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);
}
More information about the varnish-commit
mailing list