Break out set weight processing code.
This is in preparation for reusing the code.

Also, remove duplicate check in nested if clauses.
{px->lbprm.algo & BE_LB_PROP_DYN) is checked by
the immediate outer if clause, so there is no need
to check it a second time.

Signed-off-by: Simon Horman <ho...@verge.net.au>

---

v2
* Merge with "dumpstats: Remove duplicate check in nested if clauses"
* Name parsing function server_parse_weight_change_request() and
  place it in server.c. The code is moved out of dumpstats.c as it
  will be called from outside dumpstats.c.
* Change prototype of server_parse_weight_change_request() to
  return NULL on success and an error string otherwise. Error messages
  are no longer handled by server_parse_weight_change_request() other
  than simply returning them.
---
 include/proto/server.h |    7 ++++++
 src/dumpstats.c        |   62 ++++--------------------------------------------
 src/server.c           |   58 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+), 58 deletions(-)

diff --git a/include/proto/server.h b/include/proto/server.h
index 408427b..ded640a 100644
--- a/include/proto/server.h
+++ b/include/proto/server.h
@@ -59,6 +59,13 @@ struct srv_kw *srv_find_kw(const char *kw);
 void srv_dump_kws(char **out);
 
 /*
+ * Parses weight_str and configures sv accordingly.
+ * Returns NULL on success, error message string otherwise.
+ */
+const char *server_parse_weight_change_request(struct server *sv,
+                                              const char *weight_str);
+
+/*
  * Local variables:
  *  c-indent-level: 8
  *  c-basic-offset: 8
diff --git a/src/dumpstats.c b/src/dumpstats.c
index 5954e8c..0c3c2ae 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -1089,72 +1089,18 @@ static int stats_sock_parse_request(struct 
stream_interface *si, char *line)
        }
        else if (strcmp(args[0], "set") == 0) {
                if (strcmp(args[1], "weight") == 0) {
-                       struct proxy *px;
                        struct server *sv;
-                       int w;
+                       const char *warning;
 
                        sv = expect_server_admin(s, si, args[2]);
                        if (!sv)
                                return 1;
-                       px = sv->proxy;
-
-                       /* if the weight is terminated with '%', it is set 
relative to
-                        * the initial weight, otherwise it is absolute.
-                        */
-                       if (!*args[3]) {
-                               si->applet.ctx.cli.msg = "Require <weight> or 
<weight%>.\n";
-                               si->applet.st0 = STAT_CLI_PRINT;
-                               return 1;
-                       }
-
-                       w = atoi(args[3]);
-                       if (strchr(args[3], '%') != NULL) {
-                               if (w < 0 || w > 100) {
-                                       si->applet.ctx.cli.msg = "Relative 
weight can only be set between 0 and 100% inclusive.\n";
-                                       si->applet.st0 = STAT_CLI_PRINT;
-                                       return 1;
-                               }
-                               w = sv->iweight * w / 100;
-                       }
-                       else {
-                               if (w < 0 || w > 256) {
-                                       si->applet.ctx.cli.msg = "Absolute 
weight can only be between 0 and 256 inclusive.\n";
-                                       si->applet.st0 = STAT_CLI_PRINT;
-                                       return 1;
-                               }
-                       }
 
-                       if (w && w != sv->iweight && !(px->lbprm.algo & 
BE_LB_PROP_DYN)) {
-                               si->applet.ctx.cli.msg = "Backend is using a 
static LB algorithm and only accepts weights '0%' and '100%'.\n";
+                       warning = server_parse_weight_change_request(sv, 
args[3]);
+                       if (warning) {
+                               si->applet.ctx.cli.msg = warning;
                                si->applet.st0 = STAT_CLI_PRINT;
-                               return 1;
                        }
-
-                       sv->uweight = w;
-
-                       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);
-                       }
-
                        return 1;
                }
                else if (strcmp(args[1], "timeout") == 0) {
diff --git a/src/server.c b/src/server.c
index 568d042..7a2774c 100644
--- a/src/server.c
+++ b/src/server.c
@@ -157,6 +157,64 @@ static void __listener_init(void)
 }
 
 /*
+ * Parses weight_str and configures sv accordingly.
+ * Returns NULL on success, error message string otherwise.
+ */
+const char *server_parse_weight_change_request(struct server *sv,
+                                              const char *weight_str)
+{
+       struct proxy *px;
+       int w;
+
+       px = sv->proxy;
+
+       /* if the weight is terminated with '%', it is set relative to
+        * the initial weight, otherwise it is absolute.
+        */
+       if (!*weight_str)
+               return "Require <weight> or <weight%>.\n";
+
+       w = atoi(weight_str);
+       if (strchr(weight_str, '%') != NULL) {
+               if (w < 0 || w > 100)
+                       return "Relative weight must be positive.\n";
+               w = sv->iweight * w / 100;
+       }
+       else if (w < 0 || w > 256)
+               return "Absolute weight can only be between 0 and 256 
inclusive.\n";
+
+       if (w && w != sv->iweight && !(px->lbprm.algo & BE_LB_PROP_DYN))
+               return "Backend is using a static LB algorithm and only accepts 
weights '0%' and '100%'.\n";
+
+       sv->uweight = w;
+
+       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))
+                       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);
+       }
+
+       return NULL;
+}
+
+/*
  * Local variables:
  *  c-indent-level: 8
  *  c-basic-offset: 8
-- 
1.7.10.4


Reply via email to