[master] b6b249a Don't yank/recreate VBE->vsc on COLD/WARM events, instead just mark them to be ignored in VSCAPI and do so there.

Poul-Henning Kamp phk at FreeBSD.org
Mon Jan 8 23:19:08 UTC 2018


commit b6b249ae42e774fcf8dae0b14584fede5af4798d
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Jan 8 23:17:40 2018 +0000

    Don't yank/recreate VBE->vsc on COLD/WARM events, instead just mark them
    to be ignored in VSCAPI and do so there.

diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 826b13d..44c1d2b 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -196,6 +196,7 @@ vbe_dir_finish(const struct director *d, struct worker *wrk,
 	}
 	assert(bp->n_conn > 0);
 	bp->n_conn--;
+	AN(bp->vsc);
 	bp->vsc->conn--;
 #define ACCT(foo)	bp->vsc->foo += bo->acct.foo;
 #include "tbl/acct_fields_bereq.h"
@@ -339,13 +340,8 @@ vbe_dir_event(const struct director *d, enum vcl_event_e ev)
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	CAST_OBJ_NOTNULL(bp, d->priv, BACKEND_MAGIC);
 
-	if (ev == VCL_EVENT_WARM) {
-		AZ(bp->vsc);
-		bp->vsc =
-		    VSC_vbe_New(NULL, &bp->vsc_seg,
-			bp->director->display_name);
-		AN(bp->vsc);
-	}
+	if (ev == VCL_EVENT_WARM)
+		VRT_VSC_Reveal(bp->vsc_seg);
 
 	if (bp->probe != NULL && ev == VCL_EVENT_WARM)
 		VBP_Control(bp, 1);
@@ -353,12 +349,8 @@ vbe_dir_event(const struct director *d, enum vcl_event_e ev)
 	if (bp->probe != NULL && ev == VCL_EVENT_COLD)
 		VBP_Control(bp, 0);
 
-	if (ev == VCL_EVENT_COLD) {
-		Lck_Lock(&backends_mtx);
-		bp->vsc = NULL;
-		Lck_Unlock(&backends_mtx);
-		VSC_vbe_Destroy(&bp->vsc_seg);
-	}
+	if (ev == VCL_EVENT_COLD)
+		VRT_VSC_Hide(bp->vsc_seg);
 }
 
 /*---------------------------------------------------------------------*/
@@ -374,6 +366,7 @@ vbe_destroy(const struct director *d)
 	if (be->probe != NULL)
 		VBP_Remove(be);
 
+	VSC_vbe_Destroy(&be->vsc_seg);
 	Lck_Lock(&backends_mtx);
 	if (be->cooled > 0)
 		VTAILQ_REMOVE(&cool_backends, be, list);
@@ -389,7 +382,6 @@ vbe_destroy(const struct director *d)
 #undef DA
 #undef DN
 
-	AZ(be->vsc);
 	Lck_Delete(&be->mtx);
 	FREE_OBJ(be);
 }
@@ -494,6 +486,10 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
 		VBP_Insert(be, vbp, be->tcp_pool);
 	}
 
+	be->vsc = VSC_vbe_New(NULL, &be->vsc_seg,
+	    "%s.%s", VCL_Name(ctx->vcl), vrt->vcl_name);
+	AN(be->vsc);
+
 	retval = VCL_AddDirector(ctx->vcl, d, vrt->vcl_name);
 
 	if (retval == 0)
diff --git a/bin/varnishd/common/common_vsc.c b/bin/varnishd/common/common_vsc.c
index 205a49a..e6caf04 100644
--- a/bin/varnishd/common/common_vsc.c
+++ b/bin/varnishd/common/common_vsc.c
@@ -105,6 +105,22 @@ vrt_vsc_mksegf(const char *class, size_t payload, const char *fmt, ...)
 	return (vsg);
 }
 
+void
+VRT_VSC_Hide(struct vsc_seg *vsg)
+{
+	CHECK_OBJ_NOTNULL(vsg, VSC_SEG_MAGIC);
+	assert(vsg->head->ready > 0);
+	vsg->head->ready = 2;
+}
+
+void
+VRT_VSC_Reveal(struct vsc_seg *vsg)
+{
+	CHECK_OBJ_NOTNULL(vsg, VSC_SEG_MAGIC);
+	assert(vsg->head->ready > 0);
+	vsg->head->ready = 1;
+}
+
 void *
 VRT_VSC_Alloc(struct vsmw_cluster *vc, struct vsc_seg **sg,
     const char *nm, size_t sd,
diff --git a/include/vrt.h b/include/vrt.h
index 05dce64..ca80b4c 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -56,6 +56,8 @@
  *	VRT_Healthy() added
  *	VRT_VSC_Alloc() added
  *	VRT_VSC_Destroy() added
+ *	VRT_VSC_Hide() added
+ *	VRT_VSC_Reveal() added
  *	struct director.event added
  *	struct director.destroy added
  *	VRT_r_beresp_storage_hint() removed - under discussion #2509
@@ -454,4 +456,6 @@ VCL_STRING VRT_TIME_string(VRT_CTX, VCL_TIME);
 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 *);
+void VRT_VSC_Hide(struct vsc_seg *);
+void VRT_VSC_Reveal(struct vsc_seg *);
 #endif
diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index 8f7c2df..8ec77b5 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -431,7 +431,7 @@ VSC_Iter(struct vsc *vsc, struct vsm *vsm, VSC_iter_f *fiter, void *priv)
 		} else {
 			sp2 = VTAILQ_NEXT(sp, list);
 		}
-		if (sp != NULL && fiter != NULL)
+		if (sp != NULL && fiter != NULL && sp->head->ready < 2)
 			i = vsc_iter_seg(vsc, sp, fiter, priv);
 		sp = sp2;
 		if (i)


More information about the varnish-commit mailing list