On Mon, Dec 24, 2012 at 07:58:13AM +0100, Willy Tarreau wrote:
> Hi Simon,
> 
> I have some minor comments below for this patch :
> 
> On Mon, Dec 24, 2012 at 10:33:54AM +0900, Simon Horman wrote:
> > +static int stats_sock_parse_weight_change_request(struct stream_interface 
> > *si,
> > +                                             struct server *sv, const char 
> > *weight_str)
> 
> Since this function will be processing weights from various sources, better
> place it into server.c and name it "server_parse_weight_change_request" (for
> example).

Sure, that sounds reasonable.

> > +{
> > +   const char *warning;
> > +   unsigned int status;
> > +   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) {
> > +           warning = "Require <weight> or <weight%>.\n";
> > +           status = STAT_CLI_PRINT;
> > +           goto err;
> > +   }
> > +
> > +   w = atoi(weight_str);
> > +   if (strchr(weight_str, '%') != NULL) {
> > +           if (w < 0 || w > 100) {
> > +                   warning = "Relative weight must be positive.\n";
> > +                   status = STAT_CLI_PRINT;
> > +                   goto err;
> > +           }
> > +           w = sv->iweight * w / 100;
> > +   }
> > +   else {
> > +           if (w < 0 || w > 256) {
> > +                   warning = "Absolute weight can only be between 0 and 
> > 256 inclusive.\n";
> > +                   status = STAT_CLI_PRINT;
> > +                   goto err;
> > +           }
> > +   }
> > +
> > +   if (w && w != sv->iweight && !(px->lbprm.algo & BE_LB_PROP_DYN)) {
> > +           warning = "Backend is using a static LB algorithm and only 
> > accepts weights '0%' and '100%'.\n";
> > +           status = STAT_CLI_PRINT;
> > +           goto err;
> > +   }
> > +
> > +   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 0;
> > +
> > +err:
> > +   if (si) {
> > +           si->applet.ctx.cli.msg = warning;
> > +           si->applet.st0 = status;
> > +   } else {
> > +           Warning("%s\n", warning);
> 
> It would be better not to emit a warning here, because it's not very
> appropriate to do that when that can be controlled by possibly untrusted
> servers, and it doesn't indicate what server caused the issue.
> 
> In the end, in order for the function not to depend on its source,
> just have it return a pointer to the warning message in case of error,
> or NULL if no error was encountered. Thus the caller can do whatever
> it wants with it. dumpstats will set the state to STAT_CLI_PRINT and
> the health check code will probably emit a log which will clearly
> indicate the proxy and server's name.

I think that should work out quite well. I'll update the code accordingly.

> > +   }
> > +   return 1;
> > +
> > +}
> > +
> > +int process_weight_change_request(struct server *sv, const char 
> > *weight_str)
> > +{
> > +   stats_sock_parse_weight_change_request(NULL, sv, weight_str);
> > +}
> 
> Warning, missing return in a non-void function.

Thanks, I'll fix that up.

> >  /* Processes the stats interpreter on the statistics socket. This function 
> > is
> >   * called from an applet running in a stream interface. The function 
> > returns 1
> >   * if the request was understood, otherwise zero. It sets si->applet.st0 
> > to a value
> > @@ -1089,72 +1174,13 @@ 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;
> >  
> >                     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";
> > -                           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);
> > -                   }
> >  
> > +                   stats_sock_parse_weight_change_request(si, sv, args[3]);
> >                     return 1;
> >             }
> >             else if (strcmp(args[1], "timeout") == 0) {
> > -- 
> > 1.7.10.4
> 
> Regards,
> Willy
> 
> 

Reply via email to