[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