[master] 0a14644 Hang backends from a list off the VCL that created them.

Poul-Henning Kamp phk at FreeBSD.org
Mon Jun 22 12:55:04 CEST 2015


commit 0a14644f9709af2153db0e841dab908d0c81ea7c
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Jun 22 10:51:54 2015 +0000

    Hang backends from a list off the VCL that created them.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 2b025ef..ab3cd4d 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -102,6 +102,7 @@ enum {
 
 struct VSC_C_lck;
 struct ban;
+struct backend;
 struct busyobj;
 struct cli;
 struct cli_proto;
@@ -1077,6 +1078,8 @@ void VCL_Poll(void);
 void VCL_Ref(struct vcl *);
 void VCL_Refresh(struct vcl **);
 void VCL_Rel(struct vcl **);
+void VCL_AddBackend(struct vcl *, struct backend *);
+void VCL_DelBackend(struct vcl *, const struct backend *);
 const char *VCL_Return_Name(unsigned);
 
 #define VCL_MET_MAC(l,u,b) \
diff --git a/bin/varnishd/cache/cache_backend.h b/bin/varnishd/cache/cache_backend.h
index c3b9152..697b77a 100644
--- a/bin/varnishd/cache/cache_backend.h
+++ b/bin/varnishd/cache/cache_backend.h
@@ -59,6 +59,7 @@ struct backend {
 #define BACKEND_MAGIC		0x64c4c7c6
 
 	VTAILQ_ENTRY(backend)	list;
+	VTAILQ_ENTRY(backend)	vcl_list;
 	int			refcount;
 	struct lock		mtx;
 
diff --git a/bin/varnishd/cache/cache_backend_cfg.c b/bin/varnishd/cache/cache_backend_cfg.c
index e2350e2..3e07591 100644
--- a/bin/varnishd/cache/cache_backend_cfg.c
+++ b/bin/varnishd/cache/cache_backend_cfg.c
@@ -105,6 +105,8 @@ VRT_new_backend(VRT_CTX, const struct vrt_backend *vrt)
 	if (vrt->probe != NULL)
 		VBP_Insert(b, vrt->probe, vrt->hosthdr);
 
+	VCL_AddBackend(ctx->vcl, b);
+
 	return (b->director);
 }
 
@@ -149,13 +151,13 @@ VRT_delete_backend(VRT_CTX, struct director **dp)
 	ASSERT_CLI();
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	AN(dp);
-	AN(*dp);
-
 	d = *dp;
 	*dp = NULL;
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	CAST_OBJ_NOTNULL(be, d->priv, BACKEND_MAGIC);
 
+	VCL_DelBackend(ctx->vcl, be);
+
 	if (be->probe != NULL)
 		VBP_Remove(be);
 
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index a6d7e80..865daac 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -39,6 +39,8 @@
 
 #include "cache.h"
 
+#include "cache_director.h"
+#include "cache_backend.h"
 #include "vcl.h"
 #include "vrt.h"
 #include "vcli.h"
@@ -59,6 +61,7 @@ struct vcl {
 	unsigned		busy;
 	unsigned		discard;
 	const char		*temp;
+	VTAILQ_HEAD(,backend)	backend_list;
 };
 
 /*
@@ -182,6 +185,29 @@ VCL_Rel(struct vcl **vcc)
 
 /*--------------------------------------------------------------------*/
 
+void
+VCL_AddBackend(struct vcl *vcl, struct backend *be)
+{
+
+	CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
+	CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC);
+	Lck_Lock(&vcl_mtx);
+	VTAILQ_INSERT_TAIL(&vcl->backend_list, be, vcl_list);
+	Lck_Unlock(&vcl_mtx);
+}
+
+void
+VCL_DelBackend(struct vcl *vcl, const struct backend *be)
+{
+	CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
+	CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC);
+	Lck_Lock(&vcl_mtx);
+	VTAILQ_REMOVE(&vcl->backend_list, be, vcl_list);
+	Lck_Unlock(&vcl_mtx);
+}
+
+/*--------------------------------------------------------------------*/
+
 static struct vcl *
 VCL_Open(const char *fn, struct vsb *msg)
 {
@@ -367,6 +393,7 @@ VCL_Load(struct cli *cli, const char *name, const char *fn, const char *state)
 
 	vcl->loaded_name = strdup(name);
 	XXXAN(vcl->loaded_name);
+	VTAILQ_INIT(&vcl->backend_list);
 
 	vcl->temp = vcl_temp_cold;
 



More information about the varnish-commit mailing list