[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