Add bias value to server score calculations

By biasing the values of all counter type scores to positive integers, the
server weights are always taken into use.

This fixes the case when weights were ignored until all score base values
were larger than zero (the mxs922_server test).
This commit is contained in:
Markus Mäkelä
2018-10-02 00:53:23 +03:00
parent ea971a664e
commit d866cb3a21
2 changed files with 5 additions and 5 deletions

View File

@ -367,8 +367,8 @@ static MXS_ROUTER_SESSION* newSession(MXS_ROUTER* instance, MXS_SESSION* session
candidate = ref;
}
}
else if (ref->connections / ref->server_weight
< candidate->connections / candidate->server_weight)
else if ((ref->connections + 1) / ref->server_weight
< (candidate->connections + 1) / candidate->server_weight)
{
/* ref has a better score. */
candidate = ref;

View File

@ -79,7 +79,7 @@ SRWBackendVector::iterator best_score(SRWBackendVector& sBackends,
SRWBackendVector::iterator backend_cmp_router_conn(SRWBackendVector& sBackends)
{
static auto server_score = [](SERVER_REF* server) {
return server->server_weight ? server->connections / server->server_weight : 0;
return server->server_weight ? (server->connections + 1) / server->server_weight : 0;
};
return best_score(sBackends, server_score);
@ -89,7 +89,7 @@ SRWBackendVector::iterator backend_cmp_router_conn(SRWBackendVector& sBackends)
SRWBackendVector::iterator backend_cmp_global_conn(SRWBackendVector& sBackends)
{
static auto server_score = [](SERVER_REF* server) {
return server->server_weight ? server->server->stats.n_current / server->server_weight : 0;
return server->server_weight ? (server->server->stats.n_current + 1) / server->server_weight : 0;
};
return best_score(sBackends, server_score);
@ -109,7 +109,7 @@ SRWBackendVector::iterator backend_cmp_behind_master(SRWBackendVector& sBackends
SRWBackendVector::iterator backend_cmp_current_load(SRWBackendVector& sBackends)
{
static auto server_score = [](SERVER_REF* server) {
return server->server_weight ? server->server->stats.n_current_ops / server->server_weight : 0;
return server->server_weight ? (server->server->stats.n_current_ops + 1) / server->server_weight : 0;
};
return best_score(sBackends, server_score);