[master] b8924bc Remember to take the VSC metadata structure into account when sizing VSMW clusters.
Poul-Henning Kamp
phk at FreeBSD.org
Wed Jan 10 20:25:06 UTC 2018
commit b8924bcd4cb1b8df7a4040236cd84df857c2c442
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Jan 10 20:23:31 2018 +0000
Remember to take the VSC metadata structure into account when
sizing VSMW clusters.
Fixes #2535
diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 0dcfa48..fd70cb2 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -419,7 +419,7 @@ size_t v_matchproto_()
VRT_backend_vsm_need(VRT_CTX)
{
(void)ctx;
- return (VSC_vbe_size);
+ return (VRT_VSC_Overhead(VSC_vbe_size));
}
struct director * v_matchproto_()
diff --git a/bin/varnishd/common/common_vsc.c b/bin/varnishd/common/common_vsc.c
index 103b967..23dd5be 100644
--- a/bin/varnishd/common/common_vsc.c
+++ b/bin/varnishd/common/common_vsc.c
@@ -74,23 +74,23 @@ static VTAILQ_HEAD(,vsc_seg) vsc_seglist =
vsc_callback_f *vsc_lock;
vsc_callback_f *vsc_unlock;
+static const size_t vsc_overhead = PRNDUP(sizeof(struct vsc_head));
+
static struct vsc_seg *
vrt_vsc_mksegv(struct vsmw_cluster *vc, const char *class,
size_t payload, const char *fmt, va_list va)
{
struct vsc_seg *vsg;
- size_t co;
- co = PRNDUP(sizeof(struct vsc_head));
ALLOC_OBJ(vsg, VSC_SEG_MAGIC);
AN(vsg);
vsg->seg = VSMW_Allocv(heritage.proc_vsmw, vc, class,
- co + PRNDUP(payload), fmt, va);
+ VRT_VSC_Overhead(payload), fmt, va);
AN(vsg->seg);
vsg->vsm = heritage.proc_vsmw;
vsg->head = (void*)vsg->seg;
- vsg->head->body_offset = co;
- vsg->ptr = (char*)vsg->seg + co;
+ vsg->head->body_offset = vsc_overhead;
+ vsg->ptr = (char*)vsg->seg + vsc_overhead;
return (vsg);
}
@@ -106,6 +106,12 @@ vrt_vsc_mksegf(const char *class, size_t payload, const char *fmt, ...)
return (vsg);
}
+size_t
+VRT_VSC_Overhead(size_t payload)
+{
+ return (vsc_overhead + PRNDUP(payload));
+}
+
void
VRT_VSC_Hide(const struct vsc_seg *vsg)
{
diff --git a/bin/varnishd/common/common_vsmw.c b/bin/varnishd/common/common_vsmw.c
index ec58bbd..cf34a8f 100644
--- a/bin/varnishd/common/common_vsmw.c
+++ b/bin/varnishd/common/common_vsmw.c
@@ -221,7 +221,7 @@ VSMW_DestroyCluster(struct vsmw *vsmw, struct vsmw_cluster **vcp)
void *
VSMW_Allocv(struct vsmw *vsmw, struct vsmw_cluster *vc,
- const char *class, size_t len,
+ const char *class, size_t payload,
const char *fmt, va_list va)
{
struct vsmwseg *seg;
@@ -233,7 +233,7 @@ VSMW_Allocv(struct vsmw *vsmw, struct vsmw_cluster *vc,
ALLOC_OBJ(seg, VSMWSEG_MAGIC);
AN(seg);
REPLACE(seg->class, class);
- seg->len = len;
+ seg->len = PRNDUP(payload);
VSB_clear(vsmw->vsb);
VSB_vprintf(vsmw->vsb, fmt, va);
@@ -241,13 +241,13 @@ VSMW_Allocv(struct vsmw *vsmw, struct vsmw_cluster *vc,
REPLACE(seg->id, VSB_data(vsmw->vsb));
if (vc == NULL)
- vc = VSMW_NewCluster(vsmw, len, class);
+ vc = VSMW_NewCluster(vsmw, seg->len, class);
AN(vc);
vc->refs++;
seg->cluster = vc;
seg->off = vc->next;
- vc->next += len;
+ vc->next += seg->len;
assert(vc->next <= vc->len);
seg->ptr = seg->off + (char*)vc->ptr;
diff --git a/include/vrt.h b/include/vrt.h
index 6835983..662399d 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -58,6 +58,7 @@
* VRT_VSC_Destroy() added
* VRT_VSC_Hide() added
* VRT_VSC_Reveal() added
+ * VRT_VSC_Overhead() added
* struct director.event added
* struct director.destroy added
* VRT_r_beresp_storage_hint() removed - under discussion #2509
@@ -455,7 +456,8 @@ VCL_STRING VRT_TIME_string(VRT_CTX, VCL_TIME);
#ifdef va_start // XXX: hackish
void *VRT_VSC_Alloc(struct vsmw_cluster *, struct vsc_seg **,
const char *, size_t, const unsigned char *, size_t, const char *, va_list);
+#endif
void VRT_VSC_Destroy(const char *, struct vsc_seg *);
void VRT_VSC_Hide(const struct vsc_seg *);
void VRT_VSC_Reveal(const struct vsc_seg *);
-#endif
+size_t VRT_VSC_Overhead(size_t);
More information about the varnish-commit
mailing list