[master] b90a835 Lock the backend tcp-pools under the backends_mtx, rather than the (implicit) CLI lock.

Poul-Henning Kamp phk at FreeBSD.org
Tue Jun 30 23:50:20 CEST 2015


commit b90a835497d04154948370fadfcc3d1b58e85970
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Jun 30 21:49:40 2015 +0000

    Lock the backend tcp-pools under the backends_mtx, rather than the
    (implicit) CLI lock.

diff --git a/bin/varnishd/cache/cache_backend_cfg.c b/bin/varnishd/cache/cache_backend_cfg.c
index 7291cd4..057dea4 100644
--- a/bin/varnishd/cache/cache_backend_cfg.c
+++ b/bin/varnishd/cache/cache_backend_cfg.c
@@ -49,6 +49,7 @@
 
 static VTAILQ_HEAD(, backend) backends = VTAILQ_HEAD_INITIALIZER(backends);
 static struct lock backends_mtx;
+
 /*--------------------------------------------------------------------
  * Create/Delete a new director::backend instance.
  */
@@ -59,6 +60,7 @@ VRT_new_backend(VRT_CTX, const struct vrt_backend *vrt)
 	struct backend *b;
 	char buf[128];
 	struct vcl *vcl;
+	struct tcp_pool *tp = NULL;
 	const struct vrt_backend_probe *vbp;
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
@@ -87,25 +89,28 @@ VRT_new_backend(VRT_CTX, const struct vrt_backend *vrt)
 
 	b->vcl = vcl;
 
-	b->tcp_pool = VBT_Ref(vrt->ipv4_suckaddr, vrt->ipv6_suckaddr);
-
 	b->healthy = 1;
 	b->health_changed = VTIM_real();
 	b->admin_health = ah_probe;
 
+	vbp = vrt->probe;
+	if (vbp == NULL)
+		vbp = VCL_DefaultProbe(vcl);
+
 	Lck_Lock(&backends_mtx);
 	VTAILQ_INSERT_TAIL(&backends, b, list);
 	VSC_C_main->n_backend++;
+	b->tcp_pool = VBT_Ref(vrt->ipv4_suckaddr, vrt->ipv6_suckaddr);
+	if (vbp != NULL) {
+		tp = VBT_Ref(vrt->ipv4_suckaddr, vrt->ipv6_suckaddr);
+		assert(b->tcp_pool == tp);
+	}
 	Lck_Unlock(&backends_mtx);
 
 	VBE_fill_director(b);
 
-	vbp = vrt->probe;
-	if (vbp == NULL)
-		vbp = VCL_DefaultProbe(vcl);
 	if (vbp != NULL)
-		VBP_Insert(b, vbp,
-		    VBT_Ref(vrt->ipv4_suckaddr, vrt->ipv6_suckaddr));
+		VBP_Insert(b, vbp, tp);
 
 	VCL_AddBackend(ctx->vcl, b);
 
@@ -167,6 +172,7 @@ VBE_Delete(struct backend *be)
 	Lck_Lock(&backends_mtx);
 	VTAILQ_REMOVE(&backends, be, list);
 	VSC_C_main->n_backend--;
+	VBT_Rel(&be->tcp_pool);
 	Lck_Unlock(&backends_mtx);
 
 #define DA(x)	do { if (be->x != NULL) free(be->x); } while (0)
@@ -177,7 +183,6 @@ VBE_Delete(struct backend *be)
 
 	free(be->display_name);
 	AZ(be->vsc);
-	VBT_Rel(&be->tcp_pool);
 	Lck_Delete(&be->mtx);
 	FREE_OBJ(be);
 }
diff --git a/bin/varnishd/cache/cache_backend_tcp.c b/bin/varnishd/cache/cache_backend_tcp.c
index 05fd232..3e99387 100644
--- a/bin/varnishd/cache/cache_backend_tcp.c
+++ b/bin/varnishd/cache/cache_backend_tcp.c
@@ -127,7 +127,6 @@ VBT_Ref(const struct suckaddr *ip4, const struct suckaddr *ip6)
 {
 	struct tcp_pool *tp;
 
-	ASSERT_CLI();
 	VTAILQ_FOREACH(tp, &pools, list) {
 		assert(tp->refcnt > 0);
 		if (ip4 == NULL) {



More information about the varnish-commit mailing list