[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