[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