[master] 4f3ed52 Add an intersticial struct between vcl and directors

Poul-Henning Kamp phk at FreeBSD.org
Wed Apr 25 08:27:16 UTC 2018


commit 4f3ed523166cf41ac84fb52d27fc059d5229d3de
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Apr 25 06:50:41 2018 +0000

    Add an intersticial struct between vcl and directors

diff --git a/bin/varnishd/cache/cache_director.h b/bin/varnishd/cache/cache_director.h
index 5a9cb60..43e7e4b 100644
--- a/bin/varnishd/cache/cache_director.h
+++ b/bin/varnishd/cache/cache_director.h
@@ -37,6 +37,8 @@
  *
  */
 
+struct vcldir;
+
 typedef unsigned vdi_healthy_f(const struct director *, const struct busyobj *,
     double *changed);
 /* XXX need a VRT_CTX argument */
@@ -84,9 +86,9 @@ struct director {
 
 	/* Internal Housekeeping fields */
 
+	struct vcldir			*vdir;
+
 	char				*cli_name;
-	VTAILQ_ENTRY(director)		vcl_list;
-	struct vcl			*vcl;
 
 	unsigned			health;
 	const struct vdi_ahealth	*admin_health;
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index 2e17896..7ca458c 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -224,13 +224,13 @@ vcl_iterdir(struct cli *cli, const char *pat, const struct vcl *vcl,
     vcl_be_func *func, void *priv)
 {
 	int i, found = 0;
-	struct director *d;
+	struct vcldir *vdir;
 
-	VTAILQ_FOREACH(d, &vcl->director_list, vcl_list) {
-		if (fnmatch(pat, d->cli_name, 0))
+	VTAILQ_FOREACH(vdir, &vcl->director_list, list) {
+		if (fnmatch(pat, vdir->dir->cli_name, 0))
 			continue;
 		found++;
-		i = func(cli, d, priv);
+		i = func(cli, vdir->dir, priv);
 		if (i < 0)
 			return (i);
 		found += i;
@@ -285,32 +285,33 @@ VCL_IterDirector(struct cli *cli, const char *pat,
 static void
 vcl_BackendEvent(const struct vcl *vcl, enum vcl_event_e e)
 {
-	struct director *d;
+	struct vcldir *vdir;
 
 	ASSERT_CLI();
 	CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
 	AZ(vcl->busy);
 
-	VTAILQ_FOREACH(d, &vcl->director_list, vcl_list)
-		VDI_Event(d, e);
+	VTAILQ_FOREACH(vdir, &vcl->director_list, list)
+		VDI_Event(vdir->dir, e);
 }
 
 static void
 vcl_KillBackends(struct vcl *vcl)
 {
-	struct director *d;
+	struct vcldir *vdir;
 
 	CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
 	AZ(vcl->busy);
 	assert(VTAILQ_EMPTY(&vcl->ref_list));
 	while (1) {
-		d = VTAILQ_FIRST(&vcl->director_list);
-		if (d == NULL)
+		vdir = VTAILQ_FIRST(&vcl->director_list);
+		if (vdir == NULL)
 			break;
-		VTAILQ_REMOVE(&vcl->director_list, d, vcl_list);
-		AN(d->destroy);
-		REPLACE(d->cli_name, NULL);
-		d->destroy(d);
+		VTAILQ_REMOVE(&vcl->director_list, vdir, list);
+		REPLACE(vdir->dir->cli_name, NULL);
+		AN(vdir->dir->destroy);
+		vdir->dir->destroy(vdir->dir);
+		FREE_OBJ(vdir);
 	}
 }
 
diff --git a/bin/varnishd/cache/cache_vcl.h b/bin/varnishd/cache/cache_vcl.h
index f0789a8..e5a5453 100644
--- a/bin/varnishd/cache/cache_vcl.h
+++ b/bin/varnishd/cache/cache_vcl.h
@@ -35,6 +35,14 @@ struct vfp_filter;
 
 VTAILQ_HEAD(vfp_filter_head, vfp_filter);
 
+struct vcldir {
+	unsigned		magic;
+#define VCLDIR_MAGIC		0xbf726c7d
+	struct director		*dir;
+	struct vcl		*vcl;
+	VTAILQ_ENTRY(vcldir)	list;
+};
+
 struct vcl {
 	unsigned		magic;
 #define VCL_MAGIC		0x214188f2
@@ -47,7 +55,7 @@ struct vcl {
 	unsigned		discard;
 	const char		*temp;
 	pthread_rwlock_t	temp_rwl;
-	VTAILQ_HEAD(,director)	director_list;
+	VTAILQ_HEAD(,vcldir)	director_list;
 	VTAILQ_HEAD(,vclref)	ref_list;
 	int			nrefs;
 	struct vcl		*label;
diff --git a/bin/varnishd/cache/cache_vcl_vrt.c b/bin/varnishd/cache/cache_vcl_vrt.c
index ca45c76..0848a56 100644
--- a/bin/varnishd/cache/cache_vcl_vrt.c
+++ b/bin/varnishd/cache/cache_vcl_vrt.c
@@ -130,13 +130,20 @@ VRT_AddDirector(VRT_CTX, struct director *d, const char *vcl_name)
 {
 	struct vsb *vsb;
 	struct vcl *vcl;
+	struct vcldir *vdir;
 
+	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	vcl = ctx->vcl;
 	CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
-	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	AN(d->destroy);
-	d->admin_health = VDI_AH_PROBE;
 
+	AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
+	if (vcl->temp == VCL_TEMP_COOLING) {
+		AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
+		return (1);
+	}
+
+	d->admin_health = VDI_AH_PROBE;
 	vsb = VSB_new_auto();
 	AN(vsb);
 	VSB_printf(vsb, "%s.%s", VCL_Name(vcl), vcl_name);
@@ -144,15 +151,14 @@ VRT_AddDirector(VRT_CTX, struct director *d, const char *vcl_name)
 	REPLACE((d->cli_name), VSB_data(vsb));
 	VSB_destroy(&vsb);
 
-	AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
-	if (vcl->temp == VCL_TEMP_COOLING) {
-		AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
-		return (1);
-	}
+	ALLOC_OBJ(vdir, VCLDIR_MAGIC);
+	AN(vdir);
+	vdir->dir = d;
+	vdir->vcl = vcl;
+	d->vdir = vdir;
 
 	Lck_Lock(&vcl_mtx);
-	VTAILQ_INSERT_TAIL(&vcl->director_list, d, vcl_list);
-	d->vcl = vcl;
+	VTAILQ_INSERT_TAIL(&vcl->director_list, vdir, list);
 	Lck_Unlock(&vcl_mtx);
 
 	if (VCL_WARM(vcl))
@@ -169,13 +175,16 @@ void
 VRT_DelDirector(VRT_CTX, struct director *d)
 {
 	struct vcl *vcl;
+	struct vcldir *vdir;
 
 	(void)ctx;
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
-	vcl = d->vcl;
+	vdir = d->vdir;
+	CHECK_OBJ_NOTNULL(vdir, VCLDIR_MAGIC);
+	vcl = vdir->vcl;
 	CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
 	Lck_Lock(&vcl_mtx);
-	VTAILQ_REMOVE(&vcl->director_list, d, vcl_list);
+	VTAILQ_REMOVE(&vcl->director_list, vdir, list);
 	Lck_Unlock(&vcl_mtx);
 
 	AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
@@ -185,6 +194,7 @@ VRT_DelDirector(VRT_CTX, struct director *d)
 	AN(d->destroy);
 	REPLACE(d->cli_name, NULL);
 	d->destroy(d);
+	FREE_OBJ(vdir);
 }
 
 /*--------------------------------------------------------------------*/


More information about the varnish-commit mailing list