From d72822442d1f394ea85d9d22cf591e586e0e4b37 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 4 Jun 2012 00:22:44 +0200 Subject: [PATCH] MEDIUM: stats: add support for soft stop/soft start in the admin interface One important missing feature on the web interface is the ability to perform a soft stop/soft start. This is now possible. --- include/types/proto_http.h | 2 ++ src/dumpstats.c | 2 ++ src/proto_http.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/include/types/proto_http.h b/include/types/proto_http.h index a287c35822..3457a2a381 100644 --- a/include/types/proto_http.h +++ b/include/types/proto_http.h @@ -262,6 +262,8 @@ enum { ST_ADM_ACTION_NONE = 0, ST_ADM_ACTION_DISABLE, ST_ADM_ACTION_ENABLE, + ST_ADM_ACTION_STOP, + ST_ADM_ACTION_START, }; /* status codes available for the stats admin page */ diff --git a/src/dumpstats.c b/src/dumpstats.c index 14d50e1c67..a01c6ed0de 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -3171,6 +3171,8 @@ static int stats_dump_proxy(struct stream_interface *si, struct proxy *px, struc "" "" "" + "" + "" "" "" " " diff --git a/src/proto_http.c b/src/proto_http.c index 7eeb4f64a2..c0a66879fc 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2605,6 +2605,12 @@ int http_process_req_stat_post(struct stream_interface *si, struct http_txn *txn else if (strcmp(value, "enable") == 0) { action = ST_ADM_ACTION_ENABLE; } + else if (strcmp(value, "stop") == 0) { + action = ST_ADM_ACTION_STOP; + } + else if (strcmp(value, "start") == 0) { + action = ST_ADM_ACTION_START; + } else { si->applet.ctx.stats.st_code = STAT_STATUS_ERRP; goto out; @@ -2642,6 +2648,38 @@ int http_process_req_stat_post(struct stream_interface *si, struct http_txn *txn total_servers++; } break; + case ST_ADM_ACTION_STOP: + case ST_ADM_ACTION_START: + if (action == ST_ADM_ACTION_START) + sv->uweight = sv->iweight; + else + sv->uweight = 0; + + if (px->lbprm.algo & BE_LB_PROP_DYN) { + /* we must take care of not pushing the server to full throttle during slow starts */ + if ((sv->state & SRV_WARMINGUP) && (px->lbprm.algo & BE_LB_PROP_DYN)) + sv->eweight = (BE_WEIGHT_SCALE * (now.tv_sec - sv->last_change) + sv->slowstart - 1) / sv->slowstart; + else + sv->eweight = BE_WEIGHT_SCALE; + sv->eweight *= sv->uweight; + } else { + sv->eweight = sv->uweight; + } + + /* static LB algorithms are a bit harder to update */ + if (px->lbprm.update_server_eweight) + px->lbprm.update_server_eweight(sv); + else if (sv->eweight) { + if (px->lbprm.set_server_status_up) + px->lbprm.set_server_status_up(sv); + } + else { + if (px->lbprm.set_server_status_down) + px->lbprm.set_server_status_down(sv); + } + altered_servers++; + total_servers++; + break; } } else { /* the server name is unknown or ambiguous (duplicate names) */ -- 2.47.3