[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