Ticket #1103: mod_proxy.random.patch

File mod_proxy.random.patch, 2.1 kB (added by llevesque, 18 months ago)
  • src/mod_proxy.c

     
    5757typedef enum { 
    5858        PROXY_BALANCE_UNSET, 
    5959        PROXY_BALANCE_FAIR, 
     60        PROXY_BALANCE_RANDOM, 
    6061        PROXY_BALANCE_HASH, 
    6162        PROXY_BALANCE_RR 
    6263} proxy_balance_t; 
     
    221222                        s->balance = PROXY_BALANCE_FAIR; 
    222223                } else if (buffer_is_equal_string(p->balance_buf, CONST_STR_LEN("fair"))) { 
    223224                        s->balance = PROXY_BALANCE_FAIR; 
     225                } else if (buffer_is_equal_string(p->balance_buf, CONST_STR_LEN("random"))) { 
     226                        s->balance = PROXY_BALANCE_RANDOM; 
    224227                } else if (buffer_is_equal_string(p->balance_buf, CONST_STR_LEN("round-robin"))) { 
    225228                        s->balance = PROXY_BALANCE_RR; 
    226229                } else if (buffer_is_equal_string(p->balance_buf, CONST_STR_LEN("hash"))) { 
    227230                        s->balance = PROXY_BALANCE_HASH; 
    228231                } else { 
    229232                        log_error_write(srv, __FILE__, __LINE__, "sb", 
    230                                         "proxy.balance has to be one of: fair, round-robin, hash, but not:", p->balance_buf); 
     233                                        "proxy.balance has to be one of: fair, random, round-robin, hash, but not:", p->balance_buf); 
    231234                        return HANDLER_ERROR; 
    232235                } 
    233236 
     
    10551058        unsigned long last_max = ULONG_MAX; 
    10561059        int max_usage = INT_MAX; 
    10571060        int ndx = -1; 
     1061        int rand_ndx, active_hosts; 
    10581062        size_t k; 
    10591063        buffer *fn; 
    10601064        data_array *extension = NULL; 
     
    11731177                } 
    11741178 
    11751179                break; 
     1180        case PROXY_BALANCE_RANDOM: 
     1181                /* random balancing */ 
     1182                if (p->conf.debug) { 
     1183                        log_error_write(srv, __FILE__, __LINE__,  "s", 
     1184                                        "proxy - used random balancing"); 
     1185                } 
     1186 
     1187                active_hosts = 0; 
     1188 
     1189                for (k = 0; k < extension->value->used; k++) { 
     1190                        data_proxy *host = (data_proxy *)extension->value->data[k]; 
     1191 
     1192                        if (host->is_disabled) continue; 
     1193 
     1194                        active_hosts++; 
     1195                } 
     1196 
     1197                rand_ndx = (int) (1.0 * active_hosts * rand()/(RAND_MAX)); 
     1198 
     1199                active_hosts = 0; 
     1200                for (k = 0, ndx = -1; k < extension->value->used; k++) { 
     1201                        data_proxy *host = (data_proxy *)extension->value->data[k]; 
     1202 
     1203                        if (host->is_disabled) continue; 
     1204 
     1205                        if (rand_ndx == active_hosts++) { 
     1206                                ndx = k; 
     1207                                break; 
     1208                        } 
     1209                } 
     1210 
     1211                break; 
    11761212        case PROXY_BALANCE_RR: 
    11771213                /* round robin */ 
    11781214                if (p->conf.debug) {