AH, sorry, my mistake. I read your mail too quickly. Baptiste
On Wed, May 29, 2013 at 9:18 AM, Godbach <[email protected]> wrote: > Hi Baptiste > > Thanks for your replying. > > I am using the balance roundrobin algorithm and sticking on src, not the the > balance source algorithm. The configuration has been presented in my first > mail as below: > > >>> backend pool >>> balance roundrobin. >>> stick-table type ip size 200k expire 600s >>> stick on src >>> server 1 10.128.7.1:80 id 1 cookie srv1 weight 1 maxconn 0 >>> slowstart 0s >>> server 2 10.128.7.2:80 id 2 cookie srv2 weight 1 maxconn 0 >>> slowstart 0s >>> > > Best Regards, > Godbach > > > On 2013/5/29 13:35, Baptiste wrote: >> >> Hi Godbach, >> >> Before reading HAProxy source code, it worths reading its >> configuration guide for the options you use. >> IE, the balance source algorithm would tell you that: >> >> "This algorithm is static by default, which means that changing a >> server's weight on the fly will have no effect, but this can be >> changed using "hash-type"." >> >> Please update your configuration following the recommandation above >> and let us know your feedback. >> >> Baptiste >> >> >> >> On Wed, May 29, 2013 at 5:22 AM, Godbach <[email protected]> wrote: >>> >>> Hi, all >>> >>> It is expected that new http request will not get response from the >>> server of which weight was changed to 0. It cannot work well with >>> persistence on src but work well without the persistence in lastest >>> snapshot. >>> >>> There are two servers in my backend, and persistence on src ip has been >>> enabled in backend. The configuration in backend as below: >>> >>> backend pool >>> balance roundrobin. >>> stick-table type ip size 200k expire 600s >>> stick on src >>> server 1 10.128.7.1:80 id 1 cookie srv1 weight 1 maxconn 0 >>> slowstart 0s >>> server 2 10.128.7.2:80 id 2 cookie srv2 weight 1 maxconn 0 >>> slowstart 0s >>> >>> During continuous http requset with the same client, the stick table as >>> below: >>> # table: pool, type: ip, size:204800, used:1 >>> 0x17d2284: key=172.22.16.250 use=0 exp=599095 server_id=1 >>> Then I set weight of server 1 to 0 use command as below: >>> set weight pool/1 0 >>> And I get the weight of server 1 with command: >>> get weight pool/1 >>> The result is >>> 0 (initial 1) >>> So I think I have set the weight of sever1 to 0 successfully. But the >>> response still comes from server 1 which server 2 is expected. And the >>> stick table keeps the same. >>> >>> I review the code of process_sticking_rules() in session.c. The codes >>> when server is found as below: >>> >>> 1403 ptr = stktable_data_ptr(rule->table.t, ts, >>> STKTABLE_DT_SERVER_ID); >>> 1404 node = >>> eb32_lookup(&px->conf.used_server_id, stktable_data_cast(ptr, >>> server_id)); >>> 1405 if (node) { >>> 1406 struct server *srv; >>> 1407 >>> 1408 srv = container_of(node, struct server, >>> conf.id); >>> 1409 if ((srv->state & SRV_RUNNING) || >>> 1410 (px->options & PR_O_PERSIST) || >>> 1411 (s->flags & SN_FORCE_PRST)) { >>> 1412 s->flags |= SN_DIRECT | SN_ASSIGNED; >>> 1413 s->target = &srv->obj_type; >>> 1414 } >>> 1415 } >>> 1416 } >>> 1417 stktable_touch(rule->table.t, ts, 1); >>> >>> Line 1409 used (srv->state & SRV_RUNNING) to check the server status. >>> If I used srv_is_usable() to instead such as below: >>> - if ((srv->state & SRV_RUNNING) || >>> + if (srv_is_usable(srv->state, srv->eweight) || >>> >>> The new request will get response from server 2 once the weight of >>> server 1 is set to 0. But it seems to be just a workaround. >>> >>> Since the manual of haproxy about 'set weight' says that: >>> A typical usage of this command is to disable a server during an update >>> by setting its weight to zero. >>> >>> I am wondering that whether the flag SRV_RUNNING of server should be >>> cleared or not when its weight is set to 0. >>> >>> -- >>> Best Regards, >>> Godbach >>> >> > > > -- > Best Regards, > Godbach

