[master] d50db26 Close a race between backend probe and vcl.state=Cold by removing the be->vsc under backend mtx.
Poul-Henning Kamp
phk at FreeBSD.org
Mon Nov 27 12:30:13 UTC 2017
commit d50db264c16c342758f13e9a1940110eb89e227f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Nov 27 11:54:31 2017 +0000
Close a race between backend probe and vcl.state=Cold by removing
the be->vsc under backend mtx.
Fixes #2505
diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 48075d9..d05cb80 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -335,6 +335,7 @@ static void
vbe_dir_event(const struct director *d, enum vcl_event_e ev)
{
struct backend *bp;
+ struct VSC_vbe *vsc;
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(bp, d->priv, BACKEND_MAGIC);
@@ -353,7 +354,11 @@ vbe_dir_event(const struct director *d, enum vcl_event_e ev)
if (ev == VCL_EVENT_COLD) {
AN(bp->vsc);
- VSC_vbe_Destroy(&bp->vsc);
+ Lck_Lock(&backends_mtx);
+ vsc = bp->vsc;
+ bp->vsc = NULL;
+ Lck_Unlock(&backends_mtx);
+ VSC_vbe_Destroy(&vsc);
AZ(bp->vsc);
}
}
@@ -524,6 +529,7 @@ void
VBE_SetHappy(const struct backend *be, uint64_t happy)
{
+ CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC);
Lck_Lock(&backends_mtx);
if (be->vsc != NULL)
be->vsc->happy = happy;
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index afb4ea0..e042a61 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -997,8 +997,10 @@ vcl_cli_discard(struct cli *cli, const char * const *av, void *priv)
free(vcl->loaded_name);
AZ(errno=pthread_rwlock_destroy(&vcl->temp_rwl));
FREE_OBJ(vcl);
- } else if (vcl->temp == VCL_TEMP_COLD)
+ } else {
+ assert(vcl->temp == VCL_TEMP_COLD);
VCL_Poll();
+ }
}
static void __match_proto__(cli_func_t)
More information about the varnish-commit
mailing list