Commit ecb58d71 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

(Almost) separate VSMW_cluster from VSMW_segment.

parent 355bf7e7
......@@ -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;
......
......@@ -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);
......
......@@ -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)
{
......
......@@ -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);
......
......@@ -49,7 +49,7 @@
#include "common/common_param.h"
struct vsc_seg;
struct vsm_cluster;
struct vsmw_cluster;
#include "VSC_mgt.h"
struct cli;
......
......@@ -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);
......
......@@ -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
......@@ -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");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment