Permalink
Browse files

Move the admin health states all the way to VDI

  • Loading branch information...
bsdphk committed Nov 14, 2017
1 parent b9eaa41 commit bcda8d9d0cd70f4f44e38d4bdd1fa3a8745bf753
@@ -355,7 +355,7 @@ vbe_panic(const struct director *d, struct vsb *vsb)
VSB_printf(vsb, "health = %s,\n",
bp->director->health ? "healthy" : "sick");
VSB_printf(vsb, "admin_health = %s, changed = %f,\n",
VBE_AdminHealth(bp->director->admin_health),
VDI_Ahealth(bp->director),
bp->director->health_changed);
VSB_printf(vsb, "n_conn = %u,\n", bp->n_conn);
}
@@ -41,7 +41,6 @@ struct vbp_target;
struct vrt_ctx;
struct vrt_backend_probe;
struct tcp_pool;
struct vbe_ahealth;
/*--------------------------------------------------------------------
* An instance of a backend from a VCL program.
@@ -79,7 +78,6 @@ void VBE_fill_director(struct backend *be);
/* cache_backend_cfg.c */
void VBE_SetHappy(const struct backend *, uint64_t);
void VBE_Delete(const struct director *);
const char *VBE_AdminHealth(const struct vbe_ahealth *);
/* cache_backend_probe.c */
void VBP_Insert(struct backend *b, struct vrt_backend_probe const *p,
@@ -55,50 +55,6 @@ static VTAILQ_HEAD(, backend) cool_backends =
VTAILQ_HEAD_INITIALIZER(cool_backends);
static struct lock backends_mtx;
/*--------------------------------------------------------------------*/
#define AHEALTH_LIST \
AHEALTH(healthy) \
AHEALTH(sick) \
AHEALTH(probe) \
AHEALTH(deleted)
struct vbe_ahealth {
const char *state;
};
#define AHEALTH(x) static const struct vbe_ahealth vbe_ah_##x[1] = {{ #x }};
AHEALTH_LIST
#undef AHEALTH
/*---------------------------------------------------------------------
* String to admin_health
*/
static const struct vbe_ahealth *
vbe_str2adminhealth(const char *wstate)
{
#define FOO(x, y) if (strcasecmp(wstate, #x) == 0) return (vbe_ah_##y)
FOO(healthy, healthy);
FOO(sick, sick);
FOO(probe, probe);
FOO(auto, probe);
return (NULL);
#undef FOO
}
const char *
VBE_AdminHealth(const struct vbe_ahealth *ah)
{
#define AHEALTH(x) if (ah == vbe_ah_##x) return(ah->state);
AHEALTH_LIST
#undef AHEALTH
WRONG("Wrong Admin Health State");
}
#undef AHEALTH_LIST
/*--------------------------------------------------------------------
* Create a new static or dynamic director::backend instance.
*/
@@ -135,7 +91,7 @@ VRT_new_backend(VRT_CTX, const struct vrt_backend *vrt)
b->director->health = 1;
b->director->health_changed = VTIM_real();
b->director->admin_health = vbe_ah_probe;
b->director->admin_health = VDI_AH_PROBE;
vbp = vrt->probe;
if (vbp == NULL)
@@ -179,7 +135,7 @@ VRT_delete_backend(VRT_CTX, struct director **dp)
TAKE_OBJ_NOTNULL(d, dp, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(be, d->priv, BACKEND_MAGIC);
Lck_Lock(&be->mtx);
be->director->admin_health = vbe_ah_deleted;
be->director->admin_health = VDI_AH_DELETED;
be->director->health_changed = VTIM_real();
be->cooled = VTIM_real() + 60.;
Lck_Unlock(&be->mtx);
@@ -249,16 +205,16 @@ VDI_Healthy(const struct director *d, double *changed)
if (changed != NULL)
*changed = d->health_changed;
if (d->admin_health == vbe_ah_probe)
if (d->admin_health == VDI_AH_PROBE)
return (d->health);
if (d->admin_health == vbe_ah_sick)
if (d->admin_health == VDI_AH_SICK)
return (0);
if (d->admin_health == vbe_ah_deleted)
if (d->admin_health == VDI_AH_DELETED)
return (0);
if (d->admin_health == vbe_ah_healthy)
if (d->admin_health == VDI_AH_HEALTHY)
return (1);
WRONG("Wrong admin health");
@@ -277,12 +233,12 @@ do_list(struct cli *cli, struct director *d, void *priv)
probes = priv;
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(be, d->priv, BACKEND_MAGIC);
if (d->admin_health == vbe_ah_deleted)
if (d->admin_health == VDI_AH_DELETED)
return (0);
VCLI_Out(cli, "\n%-30s", d->display_name);
VCLI_Out(cli, " %-10s", VBE_AdminHealth(d->admin_health));
VCLI_Out(cli, " %-10s", VDI_Ahealth(d));
if (be->probe == NULL)
VCLI_Out(cli, " %-20s", "Healthy (no probe)");
@@ -329,19 +285,16 @@ cli_backend_list(struct cli *cli, const char * const *av, void *priv)
static int __match_proto__(vcl_be_func)
do_set_health(struct cli *cli, struct director *d, void *priv)
{
const struct vbe_ahealth *ah;
unsigned prev;
(void)cli;
AN(priv);
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
if (d->admin_health == vbe_ah_deleted)
if (d->admin_health == VDI_AH_DELETED)
return (0);
ah = *(const struct vbe_ahealth **)priv;
AN(ah);
prev = VDI_Healthy(d, NULL);
if (d->admin_health != vbe_ah_deleted)
d->admin_health = ah;
d->admin_health = *(const struct vdi_ahealth **)priv;
(void)VDI_Ahealth(d); // Acts like type-check
if (prev != VDI_Healthy(d, NULL))
d->health_changed = VTIM_real();
@@ -351,16 +304,16 @@ do_set_health(struct cli *cli, struct director *d, void *priv)
static void __match_proto__()
cli_backend_set_health(struct cli *cli, const char * const *av, void *priv)
{
const struct vbe_ahealth *ah;
const struct vdi_ahealth *ah;
int n;
(void)av;
(void)priv;
ASSERT_CLI();
AN(av[2]);
AN(av[3]);
ah = vbe_str2adminhealth(av[3]);
if (ah == NULL) {
ah = VDI_Str2Ahealth(av[3]);
if (ah == NULL || ah == VDI_AH_DELETED) {
VCLI_Out(cli, "Invalid state %s", av[3]);
VCLI_SetResult(cli, CLIS_PARAM);
return;
@@ -39,6 +39,37 @@
#include "cache_director.h"
/* -------------------------------------------------------------------*/
struct vdi_ahealth {
const char *name;
};
#define VBE_AHEALTH(l,u) \
static const struct vdi_ahealth vdi_ah_##l[1] = {{#l}}; \
const struct vdi_ahealth * const VDI_AH_##u = vdi_ah_##l;
VBE_AHEALTH_LIST
#undef VBE_AHEALTH
const struct vdi_ahealth *
VDI_Str2Ahealth(const char *t)
{
#define VBE_AHEALTH(l,u) if (!strcasecmp(t, #l)) return (VDI_AH_##u);
VBE_AHEALTH_LIST
#undef VBE_AHEALTH
if (!strcasecmp(t, "auto")) return (VDI_AH_PROBE);
return (NULL);
}
const char *
VDI_Ahealth(const struct director *d)
{
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
AN(d->admin_health);
return (d->admin_health->name);
}
/* Resolve director --------------------------------------------------*/
static const struct director *
@@ -84,7 +84,7 @@ struct director {
struct vcl *vcl;
unsigned health;
const struct vbe_ahealth *admin_health;
const struct vdi_ahealth *admin_health;
double health_changed;
};
@@ -93,3 +93,18 @@ unsigned VDI_Healthy(const struct director *, double *);
/* cache_vcl.c */
int VCL_AddDirector(struct vcl *, struct director *, const char *);
void VCL_DelDirector(struct director *);
/* cache_director.c */
#define VBE_AHEALTH_LIST \
VBE_AHEALTH(healthy, HEALTHY) \
VBE_AHEALTH(sick, SICK) \
VBE_AHEALTH(probe, PROBE) \
VBE_AHEALTH(deleted, DELETED)
#define VBE_AHEALTH(l,u) extern const struct vdi_ahealth * const VDI_AH_##u;
VBE_AHEALTH_LIST
#undef VBE_AHEALTH
const struct vdi_ahealth *VDI_Str2Ahealth(const char *t);
const char *VDI_Ahealth(const struct director *d);

0 comments on commit bcda8d9

Please sign in to comment.