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.
diff --git a/include/types/proto_http.h b/include/types/proto_http.h
index a287c35..3457a2a 100644
--- a/include/types/proto_http.h
+++ b/include/types/proto_http.h
@@ -262,6 +262,8 @@
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 14d50e1..a01c6ed 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -3171,6 +3171,8 @@
"<option value=\"\"></option>"
"<option value=\"disable\">Disable</option>"
"<option value=\"enable\">Enable</option>"
+ "<option value=\"stop\">Soft Stop</option>"
+ "<option value=\"start\">Soft Start</option>"
"</select>"
"<input type=\"hidden\" name=\"b\" value=\"#%d\">"
" <input type=\"submit\" value=\"Apply\">"
diff --git a/src/proto_http.c b/src/proto_http.c
index 7eeb4f6..c0a6687 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -2605,6 +2605,12 @@
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;
@@ -2641,6 +2647,38 @@
altered_servers++;
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 {