From 4d2eab61d4b468231e63f4f00ad0afb695f53185 Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Thu, 23 Apr 2015 14:51:26 +0900 Subject: [PATCH] MEDIUM: stats: Add enum srv_stats_state Add an enumeration to make the handling of the states of servers in status messages somewhat clearer. This is the first of a two-step attempt to disentangle the state and colour of status information. A subsequent patch will separate state colours from the states themselves. This patch should not make any functional changes. Signed-off-by: Simon Horman --- src/dumpstats.c | 104 ++++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 47 deletions(-) diff --git a/src/dumpstats.c b/src/dumpstats.c index d82ce8538..402fb0ae9 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -2919,14 +2919,28 @@ static int stats_dump_li_stats(struct stream_interface *si, struct proxy *px, st return 1; } +enum srv_stats_state { + SRV_STATS_STATE_DOWN = 0, + SRV_STATS_STATE_DOWN_AGENT, + SRV_STATS_STATE_GOING_UP, + SRV_STATS_STATE_UP_GOING_DOWN, + SRV_STATS_STATE_UP, + SRV_STATS_STATE_NOLB_GOING_DOWN, + SRV_STATS_STATE_NOLB, + SRV_STATS_STATE_DRAIN_GOING_DOWN, + SRV_STATS_STATE_DRAIN, + SRV_STATS_STATE_NO_CHECK, + + SRV_STATS_STATE_COUNT, /* Must be last */ +}; + /* Dumps a line for server and proxy to the trash and uses the state * from stream interface , stats flags , and server state . * The caller is responsible for clearing the trash if needed. Returns non-zero - * if it emits anything, zero otherwise. The parameter can take the - * following values : 0=DOWN, 1=DOWN(agent) 2=going up, 3=going down, 4=UP, 5,6=NOLB, - * 7,8=DRAIN, 9=unchecked. + * if it emits anything, zero otherwise. */ -static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, int flags, struct server *sv, int state) +static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, int flags, struct server *sv, + enum srv_stats_state state) { struct appctx *appctx = __objt_appctx(si->end); struct server *via, *ref; @@ -2943,17 +2957,17 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in ref = ref->track; if (appctx->ctx.stats.flags & STAT_FMT_HTML) { - static char *srv_hlt_st[10] = { - "DOWN", - "DOWN (agent)", - "DN %d/%d ↑", - "UP %d/%d ↓", - "UP", - "NOLB %d/%d ↓", - "NOLB", - "DRAIN %d/%d ↓", - "DRAIN", - "no check" + static char *srv_hlt_st[SRV_STATS_STATE_COUNT] = { + [SRV_STATS_STATE_DOWN] = "DOWN", + [SRV_STATS_STATE_DOWN_AGENT] = "DOWN (agent)", + [SRV_STATS_STATE_GOING_UP] = "DN %d/%d ↑", + [SRV_STATS_STATE_UP_GOING_DOWN] = "UP %d/%d ↓", + [SRV_STATS_STATE_UP] = "UP", + [SRV_STATS_STATE_NOLB_GOING_DOWN] = "NOLB %d/%d ↓", + [SRV_STATS_STATE_NOLB] = "NOLB", + [SRV_STATS_STATE_DRAIN_GOING_DOWN] = "DRAIN %d/%d ↓", + [SRV_STATS_STATE_DRAIN] = "DRAIN", + [SRV_STATS_STATE_NO_CHECK] = "no check", }; if (sv->admin & SRV_ADMF_MAINT) @@ -3197,17 +3211,17 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in chunk_appendf(&trash, "-\n"); } else { /* CSV mode */ - static char *srv_hlt_st[10] = { - "DOWN,", - "DOWN (agent),", - "DOWN %d/%d,", - "UP %d/%d,", - "UP,", - "NOLB %d/%d,", - "NOLB,", - "DRAIN %d/%d,", - "DRAIN,", - "no check," + static char *srv_hlt_st[SRV_STATS_STATE_COUNT] = { + [SRV_STATS_STATE_DOWN] = "DOWN,", + [SRV_STATS_STATE_DOWN_AGENT] = "DOWN (agent),", + [SRV_STATS_STATE_GOING_UP] = "DOWN %d/%d,", + [SRV_STATS_STATE_UP_GOING_DOWN] = "UP %d/%d,", + [SRV_STATS_STATE_UP] = "UP,", + [SRV_STATS_STATE_NOLB_GOING_DOWN] = "NOLB %d/%d,", + [SRV_STATS_STATE_NOLB] = "NOLB,", + [SRV_STATS_STATE_DRAIN_GOING_DOWN] = "DRAIN %d/%d,", + [SRV_STATS_STATE_DRAIN] = "DRAIN,", + [SRV_STATS_STATE_NO_CHECK] = "no check," }; chunk_appendf(&trash, @@ -3838,7 +3852,7 @@ static int stats_dump_proxy_to_buffer(struct stream_interface *si, struct proxy case STAT_PX_ST_SV: /* stats.sv has been initialized above */ for (; appctx->ctx.stats.sv != NULL; appctx->ctx.stats.sv = sv->next) { - int sv_state; + enum srv_stats_state sv_state; if (buffer_almost_full(rep->buf)) { si->flags |= SI_FL_WAIT_ROOM; @@ -3860,42 +3874,38 @@ static int stats_dump_proxy_to_buffer(struct stream_interface *si, struct proxy svs = svs->track; if (sv->state == SRV_ST_RUNNING || sv->state == SRV_ST_STARTING) { - /* server is UP. The possibilities are : - * - UP, draining, going down => state = 7 - * - UP, going down => state = 3 - * - UP, draining => state = 8 - * - UP, checked => state = 4 - * - UP, not checked nor tracked => state = 9 - */ - if ((svs->check.state & CHK_ST_ENABLED) && (svs->check.health < svs->check.rise + svs->check.fall - 1)) - sv_state = 3; + sv_state = SRV_STATS_STATE_UP_GOING_DOWN; else - sv_state = 4; + sv_state = SRV_STATS_STATE_UP; - if (server_is_draining(sv)) - sv_state += 4; + if (server_is_draining(sv)) { + if (sv_state == SRV_STATS_STATE_UP_GOING_DOWN) + sv_state = SRV_STATS_STATE_DRAIN_GOING_DOWN; + else + sv_state = SRV_STATS_STATE_DRAIN; + } - if (sv_state == 4 && !(svs->check.state & CHK_ST_ENABLED)) - sv_state = 9; /* unchecked UP */ + if (sv_state == SRV_STATS_STATE_UP && !(svs->check.state & CHK_ST_ENABLED)) + sv_state = SRV_STATS_STATE_NO_CHECK; } else if (sv->state == SRV_ST_STOPPING) { if ((!(sv->check.state & CHK_ST_ENABLED) && !sv->track) || (svs->check.health == svs->check.rise + svs->check.fall - 1)) - sv_state = 6; /* NOLB */ + sv_state = SRV_STATS_STATE_NOLB; else - sv_state = 5; /* NOLB going down */ + sv_state = SRV_STATS_STATE_NOLB_GOING_DOWN; } else { /* stopped */ if ((svs->agent.state & CHK_ST_ENABLED) && !svs->agent.health) - sv_state = 1; /* DOWN (agent) */ + sv_state = SRV_STATS_STATE_DOWN_AGENT; else if ((svs->check.state & CHK_ST_ENABLED) && !svs->check.health) - sv_state = 0; /* DOWN */ + sv_state = SRV_STATS_STATE_DOWN; /* DOWN */ else if ((svs->agent.state & CHK_ST_ENABLED) || (svs->check.state & CHK_ST_ENABLED)) - sv_state = 2; /* going up */ + sv_state = SRV_STATS_STATE_GOING_UP; else - sv_state = 0; /* DOWN, unchecked */ + sv_state = SRV_STATS_STATE_DOWN; /* DOWN, unchecked */ } if (((sv_state <= 1) || (sv->admin & SRV_ADMF_MAINT)) && (appctx->ctx.stats.flags & STAT_HIDE_DOWN)) {