[master] ecb58d7 (Almost) separate VSMW_cluster from VSMW_segment.

Poul-Henning Kamp phk at FreeBSD.org
Sun Jan 7 20:15:12 UTC 2018


commit ecb58d71c18071ab585cbc3b3c9e9ac044c861ea
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Sun Jan 7 20:13:47 2018 +0000

    (Almost) separate VSMW_cluster from VSMW_segment.

diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 9da3fca..826b13d 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -431,7 +431,7 @@ VRT_backend_vsm_need(VRT_CTX)
 }
 
 struct director * v_matchproto_()
-VRT_new_backend_clustered(VRT_CTX, struct vsm_cluster *vc,
+VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
     const struct vrt_backend *vrt)
 {
 	struct backend *be;
diff --git a/bin/varnishd/cache/cache_vrt.c b/bin/varnishd/cache/cache_vrt.c
index f8192c1..d8914cb 100644
--- a/bin/varnishd/cache/cache_vrt.c
+++ b/bin/varnishd/cache/cache_vrt.c
@@ -625,7 +625,7 @@ VRT_purge(VRT_CTX, double ttl, double grace, double keep)
 /*--------------------------------------------------------------------
  */
 
-struct vsm_cluster * v_matchproto_()
+struct vsmw_cluster * v_matchproto_()
 VRT_VSM_Cluster_New(VRT_CTX, size_t sz)
 {
 
@@ -635,7 +635,7 @@ VRT_VSM_Cluster_New(VRT_CTX, size_t sz)
 }
 
 void v_matchproto_()
-VRT_VSM_Cluster_Destroy(VRT_CTX, struct vsm_cluster **vcp)
+VRT_VSM_Cluster_Destroy(VRT_CTX, struct vsmw_cluster **vcp)
 {
 
 	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
diff --git a/bin/varnishd/common/common_vsc.c b/bin/varnishd/common/common_vsc.c
index fa361b9..388418f 100644
--- a/bin/varnishd/common/common_vsc.c
+++ b/bin/varnishd/common/common_vsc.c
@@ -106,7 +106,7 @@ vrt_vsc_mksegf(const char *class, size_t payload, const char *fmt, ...)
 }
 
 void *
-VRT_VSC_Alloc(struct vsm_cluster *vc, struct vsc_seg **sg,
+VRT_VSC_Alloc(struct vsmw_cluster *vc, struct vsc_seg **sg,
     const char *nm, size_t sd,
     const unsigned char *jp, size_t sj, const char *fmt, va_list va)
 {
diff --git a/bin/varnishd/common/common_vsmw.c b/bin/varnishd/common/common_vsmw.c
index a5cee24..6611487 100644
--- a/bin/varnishd/common/common_vsmw.c
+++ b/bin/varnishd/common/common_vsmw.c
@@ -67,13 +67,25 @@
 
 /*--------------------------------------------------------------------*/
 
+struct vsmw_cluster {
+	unsigned			magic;
+#define VSMW_CLUSTER_MAGIC		0x28b74c00
+
+	VTAILQ_ENTRY(vsmw_cluster)	list;
+	char				*fn;
+	size_t				len;
+	void				*ptr;
+	int				refs;
+};
+
 struct vsmwseg {
 	unsigned			magic;
 #define VSMWSEG_MAGIC			0x7e4ccaea
 	VTAILQ_ENTRY(vsmwseg)		list;
-	char				*fn;
+	struct vsmw_cluster		*cluster;
 
 	char				*class;
+	size_t				off;
 	size_t				len;
 	char				*id;
 	void				*ptr;
@@ -85,6 +97,7 @@ struct vsmw {
 	int				vdirfd;
 	int				mode;
 	char				*idx;
+	VTAILQ_HEAD(, vsmw_cluster)	clusters;
 	VTAILQ_HEAD(, vsmwseg)		segs;
 	struct vsb			*vsb;
 	pid_t				pid;
@@ -110,8 +123,9 @@ vsmw_write_index(const struct vsmw *vsmw, int fd, const struct vsmwseg *seg)
 	CHECK_OBJ_NOTNULL(vsmw, VSMW_MAGIC);
 	CHECK_OBJ_NOTNULL(seg, VSMWSEG_MAGIC);
 	VSB_clear(vsmw->vsb);
-	VSB_printf(vsmw->vsb, "%s 0 %zu %s %s\n",
-	    seg->fn,
+	VSB_printf(vsmw->vsb, "%s %zu %zu %s %s\n",
+	    seg->cluster->fn,
+	    seg->off,
 	    seg->len,
 	    seg->class,
 	    seg->id);
@@ -127,6 +141,7 @@ vsmw_mkent(const struct vsmw *vsmw, const char *pfx)
 {
 	int fd;
 
+	AN(pfx);
 	while (1) {
 		VSB_clear(vsmw->vsb);
 		VSB_printf(vsmw->vsb, "_.%s", pfx);
@@ -143,46 +158,92 @@ vsmw_mkent(const struct vsmw *vsmw, const char *pfx)
 
 /*--------------------------------------------------------------------*/
 
-void *
-VSMW_Allocv(struct vsmw *vsmw, const char *class, size_t len,
-    const char *fmt, va_list va)
+static struct vsmw_cluster *
+vsmw_NewCluster(struct vsmw *vsmw, size_t len, const char *pfx)
 {
-	struct vsmwseg *seg;
+	struct vsmw_cluster *vc;
 	int fd;
 	size_t ps;
 
-	CHECK_OBJ_NOTNULL(vsmw, VSMW_MAGIC);
+	ALLOC_OBJ(vc, VSMW_CLUSTER_MAGIC);
+	AN(vc);
 
-	ALLOC_OBJ(seg, VSMWSEG_MAGIC);
-	AN(seg);
-	REPLACE(seg->class, class);
-	seg->len = len;
-
-	VSB_clear(vsmw->vsb);
-	VSB_vprintf(vsmw->vsb, fmt, va);
-	AZ(VSB_finish(vsmw->vsb));
-	REPLACE(seg->id, VSB_data(vsmw->vsb));
+	vsmw_mkent(vsmw, pfx);
+	REPLACE(vc->fn, VSB_data(vsmw->vsb));
 
-	vsmw_mkent(vsmw, class);
-	REPLACE(seg->fn, VSB_data(vsmw->vsb));
+	VTAILQ_INSERT_TAIL(&vsmw->clusters, vc, list);
 
 	ps = getpagesize();
 	len = RUP2(len, ps);
+	vc->len = len;
 
-	fd = openat(vsmw->vdirfd, seg->fn,
+	fd = openat(vsmw->vdirfd, vc->fn,
 	    O_RDWR | O_CREAT | O_EXCL, vsmw->mode);
 	assert(fd >= 0);
 
 	AZ(VFIL_allocate(fd, (off_t)len, 1));
 
-	seg->ptr = (void *)mmap(NULL, len,
+	vc->ptr = (void *)mmap(NULL, len,
 	    PROT_READ|PROT_WRITE,
 	    MAP_HASSEMAPHORE | MAP_NOSYNC | MAP_SHARED,
 	    fd, 0);
 
 	AZ(close(fd));
-	assert(seg->ptr != MAP_FAILED);
-	(void)mlock(seg->ptr, len);
+	assert(vc->ptr != MAP_FAILED);
+	(void)mlock(vc->ptr, len);
+
+	return (vc);
+}
+
+static void
+vsmw_DestroyCluster(struct vsmw *vsmw, struct vsmw_cluster **vcp)
+{
+	struct vsmw_cluster *vc;
+
+	CHECK_OBJ_NOTNULL(vsmw, VSMW_MAGIC);
+	AN(vcp);
+	vc = *vcp;
+	*vcp = NULL;
+	CHECK_OBJ_NOTNULL(vc, VSMW_CLUSTER_MAGIC);
+	AZ(vc->refs);
+
+	AZ(munmap(vc->ptr, vc->len));
+
+	VTAILQ_REMOVE(&vsmw->clusters, vc, list);
+	if (unlinkat(vsmw->vdirfd, vc->fn, 0))
+		assert (errno == ENOENT);
+	REPLACE(vc->fn, NULL);
+	FREE_OBJ(vc);
+}
+
+/*--------------------------------------------------------------------*/
+
+void *
+VSMW_Allocv(struct vsmw *vsmw, const char *class, size_t len,
+    const char *fmt, va_list va)
+{
+	struct vsmwseg *seg;
+	struct vsmw_cluster *vc;
+	int fd;
+
+	CHECK_OBJ_NOTNULL(vsmw, VSMW_MAGIC);
+
+	ALLOC_OBJ(seg, VSMWSEG_MAGIC);
+	AN(seg);
+	REPLACE(seg->class, class);
+	seg->len = len;
+
+	VSB_clear(vsmw->vsb);
+	VSB_vprintf(vsmw->vsb, fmt, va);
+	AZ(VSB_finish(vsmw->vsb));
+	REPLACE(seg->id, VSB_data(vsmw->vsb));
+
+	vc = vsmw_NewCluster(vsmw, len, class);
+	AN(vc);
+	vc->refs++;
+
+	seg->cluster = vc;
+	seg->ptr = vc->ptr;
 
 	VTAILQ_INSERT_TAIL(&vsmw->segs, seg, list);
 	fd = openat(vsmw->vdirfd, vsmw->idx, O_APPEND | O_WRONLY);
@@ -212,19 +273,14 @@ vsmw_delseg(struct vsmw *vsmw, struct vsmwseg *seg, int fixidx)
 {
 	char *t = NULL;
 	int fd;
-	size_t len;
 
 	CHECK_OBJ_NOTNULL(vsmw, VSMW_MAGIC);
 	CHECK_OBJ_NOTNULL(seg, VSMWSEG_MAGIC);
 
-	len = getpagesize();
-	len = RUP2(seg->len, len);
-	AZ(munmap(seg->ptr, len));
+	if (!--seg->cluster->refs)
+		vsmw_DestroyCluster(vsmw, &seg->cluster);
 
 	VTAILQ_REMOVE(&vsmw->segs, seg, list);
-	if (unlinkat(vsmw->vdirfd, seg->fn, 0))
-		assert (errno == ENOENT);
-	REPLACE(seg->fn, NULL);
 	REPLACE(seg->class, NULL);
 	REPLACE(seg->id, NULL);
 	FREE_OBJ(seg);
@@ -233,7 +289,8 @@ vsmw_delseg(struct vsmw *vsmw, struct vsmwseg *seg, int fixidx)
 		vsmw_mkent(vsmw, vsmw->idx);
 		REPLACE(t, VSB_data(vsmw->vsb));
 		AN(t);
-		fd = openat(vsmw->vdirfd, t, O_WRONLY|O_CREAT|O_EXCL, vsmw->mode);
+		fd = openat(vsmw->vdirfd,
+		    t, O_WRONLY|O_CREAT|O_EXCL, vsmw->mode);
 		assert(fd >= 0);
 		vsmw_idx_head(vsmw, fd);
 		VTAILQ_FOREACH(seg, &vsmw->segs, list)
@@ -280,6 +337,7 @@ VSMW_New(int vdirfd, int mode, const char *idxname)
 	AN(vsmw);
 
 	VTAILQ_INIT(&vsmw->segs);
+	VTAILQ_INIT(&vsmw->clusters);
 	vsmw->vsb = VSB_new_auto();
 	AN(vsmw->vsb);
 	REPLACE(vsmw->idx, idxname);
@@ -306,11 +364,11 @@ VSMW_Destroy(struct vsmw **pp)
 	struct vsmwseg *seg, *s2;
 
 	TAKE_OBJ_NOTNULL(vsmw, pp, VSMW_MAGIC);
+	VTAILQ_FOREACH_SAFE(seg, &vsmw->segs, list, s2)
+		vsmw_delseg(vsmw, seg, 0);
 	if (unlinkat(vsmw->vdirfd, vsmw->idx, 0))
 		assert (errno == ENOENT);
 	REPLACE(vsmw->idx, NULL);
-	VTAILQ_FOREACH_SAFE(seg, &vsmw->segs, list, s2)
-		vsmw_delseg(vsmw, seg, 0);
 	VSB_destroy(&vsmw->vsb);
 	AZ(close(vsmw->vdirfd));
 	FREE_OBJ(vsmw);
diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index 646b19c..19e4060 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -49,7 +49,7 @@
 #include "common/common_param.h"
 
 struct vsc_seg;
-struct vsm_cluster;
+struct vsmw_cluster;
 #include "VSC_mgt.h"
 
 struct cli;
diff --git a/bin/varnishd/mgt/mgt_child.c b/bin/varnishd/mgt/mgt_child.c
index 062800e..63fc3c3 100644
--- a/bin/varnishd/mgt/mgt_child.c
+++ b/bin/varnishd/mgt/mgt_child.c
@@ -347,6 +347,8 @@ mgt_launch_child(struct cli *cli)
 		child_main(mgt_param.sigsegv_handler,
 		    mgt_param.wthread_stacksize);
 
+		// VSMW_Destroy(&heritage.proc_vsmw);
+
 		exit(0);
 	}
 	assert(pid > 1);
diff --git a/include/vrt.h b/include/vrt.h
index 0a66893..05dce64 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -113,7 +113,7 @@ struct vmod_priv;
 struct vrt_acl;
 struct vsb;
 struct vsc_seg;
-struct vsm_cluster;
+struct vsmw_cluster;
 struct vsl_log;
 struct ws;
 
@@ -388,14 +388,14 @@ void VRT_synth_page(VRT_CTX, const char *, ...);
 /* Backend related */
 struct director *VRT_new_backend(VRT_CTX, const struct vrt_backend *);
 struct director *VRT_new_backend_clustered(VRT_CTX,
-    struct vsm_cluster *, const struct vrt_backend *);
+    struct vsmw_cluster *, const struct vrt_backend *);
 size_t VRT_backend_vsm_need(VRT_CTX);
 void VRT_delete_backend(VRT_CTX, struct director **);
 int VRT_backend_healthy(VRT_CTX, struct director *);
 
 /* VSM related */
-struct vsm_cluster *VRT_VSM_Cluster_New(VRT_CTX, size_t);
-void VRT_VSM_Cluster_Destroy(VRT_CTX, struct vsm_cluster **);
+struct vsmw_cluster *VRT_VSM_Cluster_New(VRT_CTX, size_t);
+void VRT_VSM_Cluster_Destroy(VRT_CTX, struct vsmw_cluster **);
 
 /* cache_director.c */
 int VRT_Healthy(VRT_CTX, VCL_BACKEND);
@@ -451,7 +451,7 @@ VCL_STRING VRT_STRANDS_string(VCL_STRANDS);
 VCL_STRING VRT_TIME_string(VRT_CTX, VCL_TIME);
 
 #ifdef va_start	// XXX: hackish
-void *VRT_VSC_Alloc(struct vsm_cluster *, struct vsc_seg **,
+void *VRT_VSC_Alloc(struct vsmw_cluster *, struct vsc_seg **,
     const char *, size_t, const unsigned char *, size_t, const char *, va_list);
 void VRT_VSC_Destroy(const char *, struct vsc_seg *);
 #endif
diff --git a/lib/libvcc/vcc_backend.c b/lib/libvcc/vcc_backend.c
index 52f72ec..b8a76ec 100644
--- a/lib/libvcc/vcc_backend.c
+++ b/lib/libvcc/vcc_backend.c
@@ -500,7 +500,7 @@ vcc_Backend_Init(struct vcc *tl)
 {
 	struct inifin *ifp;
 
-	Fh(tl, 0, "\nstatic struct vsm_cluster *vsc_cluster;\n");
+	Fh(tl, 0, "\nstatic struct vsmw_cluster *vsc_cluster;\n");
 	ifp = New_IniFin(tl);
 	VSB_printf(ifp->ini, "\tvsc_cluster = VRT_VSM_Cluster_New(ctx,\n"
 	    "\t    ndirector * VRT_backend_vsm_need(ctx));\n");


More information about the varnish-commit mailing list