[master] f2c1e64 Patch from dridi to replace CLI with mutext for locking backend config.

Poul-Henning Kamp phk at FreeBSD.org
Thu May 21 18:48:51 CEST 2015


commit f2c1e642df9c0a71d01803ebb270f6a918e56cfc
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu May 21 09:28:09 2015 +0000

    Patch from dridi to replace CLI with mutext for locking backend config.

diff --git a/bin/varnishd/cache/cache_backend_cfg.c b/bin/varnishd/cache/cache_backend_cfg.c
index 08b58d3..b917618 100644
--- a/bin/varnishd/cache/cache_backend_cfg.c
+++ b/bin/varnishd/cache/cache_backend_cfg.c
@@ -46,11 +46,8 @@
 #include "vrt.h"
 #include "vtim.h"
 
-/*
- * The list of backends is not locked, it is only ever accessed from
- * the CLI thread, so there is no need.
- */
 static VTAILQ_HEAD(, backend) backends = VTAILQ_HEAD_INITIALIZER(backends);
+static struct lock backends_mtx;
 
 /*--------------------------------------------------------------------
  */
@@ -59,10 +56,13 @@ void
 VBE_DeleteBackend(struct backend *b)
 {
 
-	ASSERT_CLI();
 	CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
 
+	Lck_Lock(&backends_mtx);
 	VTAILQ_REMOVE(&backends, b, list);
+	VSC_C_main->n_backend--;
+	Lck_Unlock(&backends_mtx);
+
 	free(b->ipv4);
 	free(b->ipv6);
 	free(b->display_name);
@@ -70,7 +70,6 @@ VBE_DeleteBackend(struct backend *b)
 	VBT_Rel(&b->tcp_pool);
 	Lck_Delete(&b->mtx);
 	FREE_OBJ(b);
-	VSC_C_main->n_backend--;
 }
 
 /*--------------------------------------------------------------------
@@ -85,7 +84,6 @@ VBE_AddBackend(const char *vcl, const struct vrt_backend *vb)
 	struct backend *b;
 	char buf[128];
 
-	ASSERT_CLI();
 	AN(vb->vcl_name);
 	assert(vb->ipv4_suckaddr != NULL || vb->ipv6_suckaddr != NULL);
 
@@ -118,8 +116,10 @@ VBE_AddBackend(const char *vcl, const struct vrt_backend *vb)
 	b->health_changed = VTIM_real();
 	b->admin_health = ah_probe;
 
+	Lck_Lock(&backends_mtx);
 	VTAILQ_INSERT_TAIL(&backends, b, list);
 	VSC_C_main->n_backend++;
+	Lck_Unlock(&backends_mtx);
 	return (b);
 }
 
@@ -176,6 +176,7 @@ backend_find(struct cli *cli, const char *matcher, bf_func *func, void *priv)
 		VSB_printf(vsb, "%s.%s", vcc->loaded_name, matcher);
 	}
 	AZ(VSB_finish(vsb));
+	Lck_Lock(&backends_mtx);
 	VTAILQ_FOREACH(b, &backends, list) {
 		if (fnmatch(VSB_data(vsb), b->display_name, 0))
 			continue;
@@ -186,6 +187,7 @@ backend_find(struct cli *cli, const char *matcher, bf_func *func, void *priv)
 			break;
 		}
 	}
+	Lck_Unlock(&backends_mtx);
 	VSB_delete(vsb);
 	return (found);
 }
@@ -313,4 +315,5 @@ VBE_InitCfg(void)
 {
 
 	CLI_AddFuncs(backend_cmds);
+	Lck_New(&backends_mtx, lck_vbe);
 }
diff --git a/include/tbl/locks.h b/include/tbl/locks.h
index e4b4914..010de43 100644
--- a/include/tbl/locks.h
+++ b/include/tbl/locks.h
@@ -46,6 +46,7 @@ LOCK(exp)
 LOCK(lru)
 LOCK(cli)
 LOCK(ban)
+LOCK(vbe)
 LOCK(vbp)
 LOCK(backend)
 LOCK(vcapace)



More information about the varnish-commit mailing list