[master] 401d1dd Make everybody use VRT_Healthy() and simplify backends as result.
Poul-Henning Kamp
phk at FreeBSD.org
Thu Apr 26 08:31:11 UTC 2018
commit 401d1dd92aec97e9a41733549442737100375266
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Apr 26 08:18:30 2018 +0000
Make everybody use VRT_Healthy() and simplify backends as result.
diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 2fb9ba8..21258a8 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -88,7 +88,7 @@ vbe_dir_getfd(struct worker *wrk, struct backend *bp, struct busyobj *bo,
CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC);
AN(bp->vsc);
- if (!VDI_Healthy(bp->director, NULL)) {
+ if (!bp->director->health) {
VSLb(bo->vsl, SLT_FetchError,
"backend %s: unhealthy", bp->director->cli_name);
// XXX: per backend stats ?
@@ -153,17 +153,6 @@ vbe_dir_getfd(struct worker *wrk, struct backend *bp, struct busyobj *bo,
return (pfd);
}
-static VCL_BOOL v_matchproto_(vdi_healthy_f)
-vbe_dir_healthy(VRT_CTX, VCL_BACKEND d, VCL_TIME *changed)
-{
- struct backend *be;
-
- CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
- CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
- CAST_OBJ_NOTNULL(be, d->priv, BACKEND_MAGIC);
- return (VDI_Healthy(be->director, changed));
-}
-
static void v_matchproto_(vdi_finish_f)
vbe_dir_finish(const struct director *d, struct worker *wrk,
struct busyobj *bo)
@@ -439,7 +428,6 @@ static const struct director_methods vbe_methods[1] = {{
.magic = DIRECTOR_METHODS_MAGIC,
.type = "backend",
.http1pipe = vbe_dir_http1pipe,
- .healthy = vbe_dir_healthy,
.gethdrs = vbe_dir_gethdrs,
.getip = vbe_dir_getip,
.finish = vbe_dir_finish,
diff --git a/bin/varnishd/cache/cache_director.c b/bin/varnishd/cache/cache_director.c
index 145d86e..7e8b4bc 100644
--- a/bin/varnishd/cache/cache_director.c
+++ b/bin/varnishd/cache/cache_director.c
@@ -219,19 +219,32 @@ VDI_Http1Pipe(struct req *req, struct busyobj *bo)
* If director has no healthy method, we just assume it is healthy.
*/
-int
-VRT_Healthy(VRT_CTX, VCL_BACKEND d)
+/*--------------------------------------------------------------------
+ * Test if backend is healthy and report when that last changed
+ */
+
+VCL_BOOL
+VRT_Healthy(VRT_CTX, VCL_BACKEND d, VCL_TIME *changed)
{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
if (d == NULL)
return (0);
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
- if (!VDI_Healthy(d, NULL))
- return (0);
- if (d->methods->healthy == NULL)
- return (1);
- return (d->methods->healthy(ctx, d, NULL));
+
+ if (d->admin_health->health >= 0) {
+ if (changed != NULL)
+ *changed = d->health_changed;
+ return (d->admin_health->health);
+ }
+
+ if (d->methods->healthy == NULL) {
+ if (changed != NULL)
+ *changed = d->health_changed;
+ return (d->health);
+ }
+
+ return (d->methods->healthy(ctx, d, changed));
}
/* Send Event ----------------------------------------------------------
@@ -270,24 +283,6 @@ VDI_Panic(const struct director *d, struct vsb *vsb, const char *nm)
VSB_printf(vsb, "},\n");
}
-/*--------------------------------------------------------------------
- * Test if backend is healthy and report when it last changed
- */
-
-unsigned
-VDI_Healthy(const struct director *d, double *changed)
-{
- CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
- AN(d->admin_health);
-
- if (changed != NULL)
- *changed = d->health_changed;
-
- if (d->admin_health->health < 0)
- return (d->health);
-
- return (d->admin_health->health);
-}
/*---------------------------------------------------------------------*/
@@ -358,43 +353,49 @@ cli_backend_list(struct cli *cli, const char * const *av, void *priv)
/*---------------------------------------------------------------------*/
+struct set_health {
+ unsigned magic;
+#define SET_HEALTH_MAGIC 0x0c46b9fb
+ const struct vdi_ahealth *ah;
+};
+
static int v_matchproto_(vcl_be_func)
do_set_health(struct cli *cli, struct director *d, void *priv)
{
- unsigned prev;
+ struct set_health *sh;
(void)cli;
- AN(priv);
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
+ CAST_OBJ_NOTNULL(sh, priv, SET_HEALTH_MAGIC);
if (d->admin_health == VDI_AH_DELETED)
return (0);
- prev = VDI_Healthy(d, NULL);
- d->admin_health = *(const struct vdi_ahealth **)priv;
- (void)VDI_Ahealth(d); // Acts like type-check
- if (prev != VDI_Healthy(d, NULL))
+ if (d->admin_health != sh->ah) {
d->health_changed = VTIM_real();
-
+ d->admin_health = sh->ah;
+ d->health = sh->ah->health ? 1 : 0;
+ }
return (0);
}
static void v_matchproto_()
cli_backend_set_health(struct cli *cli, const char * const *av, void *priv)
{
- const struct vdi_ahealth *ah;
int n;
+ struct set_health sh[1];
(void)av;
(void)priv;
ASSERT_CLI();
AN(av[2]);
AN(av[3]);
- ah = vdi_str2ahealth(av[3]);
- if (ah == NULL || ah == VDI_AH_DELETED) {
+ INIT_OBJ(sh, SET_HEALTH_MAGIC);
+ sh->ah = vdi_str2ahealth(av[3]);
+ if (sh->ah == NULL || sh->ah == VDI_AH_DELETED) {
VCLI_Out(cli, "Invalid state %s", av[3]);
VCLI_SetResult(cli, CLIS_PARAM);
return;
}
- n = VCL_IterDirector(cli, av[2], do_set_health, &ah);
+ n = VCL_IterDirector(cli, av[2], do_set_health, sh);
if (n == 0) {
VCLI_Out(cli, "No Backends matches");
VCLI_SetResult(cli, CLIS_PARAM);
diff --git a/bin/varnishd/cache/cache_director.h b/bin/varnishd/cache/cache_director.h
index 05f282a..3e502ec 100644
--- a/bin/varnishd/cache/cache_director.h
+++ b/bin/varnishd/cache/cache_director.h
@@ -99,7 +99,6 @@ struct director {
double health_changed;
};
-unsigned VDI_Healthy(const struct director *, double *);
/* cache_vcl.c */
int VRT_AddDirector(VRT_CTX, struct director *, const char *);
diff --git a/bin/varnishtest/tests/c00048.vtc b/bin/varnishtest/tests/c00048.vtc
index 4d96e29..161c0d5 100644
--- a/bin/varnishtest/tests/c00048.vtc
+++ b/bin/varnishtest/tests/c00048.vtc
@@ -23,7 +23,7 @@ varnish v1 -vcl {
} -start
-delay 1
+varnish v1 -vsl_catchup
varnish v1 -cliok "vcl.list"
varnish v1 -cliok "backend.list -p"
@@ -36,6 +36,8 @@ client c1 {
expect resp.status == 200
} -run
+varnish v1 -vsl_catchup
+
varnish v1 -cliok "backend.list"
varnish v1 -cliok "backend.set_health s1 sick"
varnish v1 -cliok "backend.list"
@@ -46,6 +48,8 @@ client c1 {
expect resp.status == 503
} -run
+varnish v1 -vsl_catchup
+
varnish v1 -cliok "backend.list"
varnish v1 -cliok "backend.set_health s1 healthy"
varnish v1 -cliok "backend.list"
@@ -56,6 +60,8 @@ client c1 {
expect resp.status == 200
} -run
+varnish v1 -vsl_catchup
+
varnish v1 -clierr 106 "backend.set_health s1 foo"
varnish v1 -clierr 106 "backend.set_health s2 foo"
varnish v1 -clierr 106 "backend.set_health s2 auto"
diff --git a/bin/varnishtest/tests/d00005.vtc b/bin/varnishtest/tests/d00005.vtc
index 4d3b857..1706901 100644
--- a/bin/varnishtest/tests/d00005.vtc
+++ b/bin/varnishtest/tests/d00005.vtc
@@ -61,7 +61,10 @@ client c1 {
expect resp.body == "22"
} -run
+varnish v1 -vsl_catchup
+
varnish v1 -cliok "backend.set_health s1 sick"
+varnish v1 -cliok "backend.list"
client c1 {
txreq
@@ -72,7 +75,10 @@ client c1 {
expect resp.body == "22"
} -run
+varnish v1 -vsl_catchup
+
varnish v1 -cliok "backend.set_health s2 sick"
+varnish v1 -cliok "backend.list"
client c1 {
txreq
diff --git a/include/vrt.h b/include/vrt.h
index 7939459..2e776c3 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -52,6 +52,8 @@
* binary/load-time compatible, increment MAJOR version
*
*
+ * TRUNK (2018-09-15)
+ * VRT_Healthy() changed prototype
* 7.0 (2018-03-15)
* lots of stuff moved from cache.h to cache_varnishd.h
* (ie: from "$Abi vrt" to "$Abi strict")
@@ -416,7 +418,7 @@ struct vsmw_cluster *VRT_VSM_Cluster_New(VRT_CTX, size_t);
void VRT_VSM_Cluster_Destroy(VRT_CTX, struct vsmw_cluster **);
/* cache_director.c */
-int VRT_Healthy(VRT_CTX, VCL_BACKEND);
+VCL_BOOL VRT_Healthy(VRT_CTX, VCL_BACKEND, VCL_TIME *);
/* Suckaddr related */
int VRT_VSA_GetPtr(const struct suckaddr *sua, const unsigned char ** dst);
diff --git a/lib/libvmod_directors/fall_back.c b/lib/libvmod_directors/fall_back.c
index 01f32fa..07d8c97 100644
--- a/lib/libvmod_directors/fall_back.c
+++ b/lib/libvmod_directors/fall_back.c
@@ -74,7 +74,7 @@ vmod_fallback_resolve(VRT_CTX, VCL_BACKEND dir)
for (u = 0; u < fb->vd->n_backend; u++) {
be = fb->vd->backend[fb->cur];
CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
- if (be->methods->healthy(ctx, be, NULL))
+ if (VRT_Healthy(ctx, be, NULL))
break;
if (++fb->cur == fb->vd->n_backend)
fb->cur = 0;
diff --git a/lib/libvmod_directors/round_robin.c b/lib/libvmod_directors/round_robin.c
index 3a983a7..c69fbf1 100644
--- a/lib/libvmod_directors/round_robin.c
+++ b/lib/libvmod_directors/round_robin.c
@@ -73,7 +73,7 @@ vmod_rr_resolve(VRT_CTX, VCL_BACKEND dir)
rr->nxt = nxt + 1;
be = rr->vd->backend[nxt];
CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
- if (be->methods->healthy(ctx, be, NULL))
+ if (VRT_Healthy(ctx, be, NULL))
break;
}
vdir_unlock(rr->vd);
diff --git a/lib/libvmod_directors/shard_dir.c b/lib/libvmod_directors/shard_dir.c
index 20cfc42..9677546 100644
--- a/lib/libvmod_directors/shard_dir.c
+++ b/lib/libvmod_directors/shard_dir.c
@@ -189,7 +189,7 @@ shard_next(struct shard_state *state, VCL_INT skip, VCL_BOOL healthy)
sbe = NULL;
be = state->shardd->backend[c].backend;
AN(be);
- if (be->methods->healthy(state->ctx, be, &changed)) {
+ if (VRT_Healthy(state->ctx, be, &changed)) {
if (skip-- == 0) {
chosen = c;
sbe = &state->last;
@@ -324,7 +324,7 @@ sharddir_any_healthy(VRT_CTX, struct sharddir *shardd, VCL_TIME *changed)
for (u = 0; u < shardd->n_backend; u++) {
be = shardd->backend[u].backend;
CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
- retval = be->methods->healthy(ctx, be, &c);
+ retval = VRT_Healthy(ctx, be, &c);
if (changed != NULL && c > *changed)
*changed = c;
if (retval)
diff --git a/lib/libvmod_directors/vdir.c b/lib/libvmod_directors/vdir.c
index 81cb8ee..94bb195 100644
--- a/lib/libvmod_directors/vdir.c
+++ b/lib/libvmod_directors/vdir.c
@@ -70,7 +70,7 @@ vdir_new(VRT_CTX, struct vdir **vdp, const char *vcl_name,
vd->dir->methods = m;
REPLACE(vd->dir->vcl_name, vcl_name);
vd->dir->priv = priv;
- vd->dir->admin_health = VDI_AH_HEALTHY;
+ vd->dir->admin_health = VDI_AH_PROBE;
vd->vbm = vbit_new(8);
AN(vd->vbm);
}
@@ -188,7 +188,7 @@ vdir_any_healthy(VRT_CTX, struct vdir *vd, VCL_TIME *changed)
for (u = 0; u < vd->n_backend; u++) {
be = vd->backend[u];
CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
- retval = be->methods->healthy(ctx, be, &c);
+ retval = VRT_Healthy(ctx, be, &c);
if (changed != NULL && c > *changed)
*changed = c;
if (retval)
@@ -230,7 +230,7 @@ vdir_pick_be(VRT_CTX, struct vdir *vd, double w)
CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
vdir_wrlock(vd);
for (u = 0; u < vd->n_backend; u++) {
- if (vd->backend[u]->methods->healthy(ctx, vd->backend[u], NULL)) {
+ if (VRT_Healthy(ctx, vd->backend[u], NULL)) {
vbit_clr(vd->vbm, u);
tw += vd->weight[u];
} else
diff --git a/lib/libvmod_std/vmod_std.c b/lib/libvmod_std/vmod_std.c
index 8651993..a4a2e0f 100644
--- a/lib/libvmod_std/vmod_std.c
+++ b/lib/libvmod_std/vmod_std.c
@@ -209,7 +209,7 @@ vmod_healthy(VRT_CTX, VCL_BACKEND be)
{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_ORNULL(be, DIRECTOR_MAGIC);
- return (VRT_Healthy(ctx, be));
+ return (VRT_Healthy(ctx, be, NULL));
}
VCL_INT v_matchproto_(td_std_port)
More information about the varnish-commit
mailing list