MXS-1777 Changing server weights to match 2.2 behavior.
Match 2.2, changed the weights back to non-inverse because 0-weight is a special case. Renamed to server_weight for greppability.
This commit is contained in:
@ -63,7 +63,7 @@ typedef struct server_ref_t
|
|||||||
{
|
{
|
||||||
struct server_ref_t* next; /**< Next server reference */
|
struct server_ref_t* next; /**< Next server reference */
|
||||||
SERVER* server; /**< The actual server */
|
SERVER* server; /**< The actual server */
|
||||||
double inv_weight; /**< Inverse of weight in the range [0..1], 0 is best. */
|
double server_weight; /**< Weight in the range [0..1]. 0 is worst, and a special case. */
|
||||||
int connections; /**< Number of connections created through this reference */
|
int connections; /**< Number of connections created through this reference */
|
||||||
bool active; /**< Whether this reference is valid and in use*/
|
bool active; /**< Whether this reference is valid and in use*/
|
||||||
} SERVER_REF;
|
} SERVER_REF;
|
||||||
|
|||||||
@ -947,7 +947,7 @@ static SERVER_REF* server_ref_create(SERVER* server)
|
|||||||
sref->next = NULL;
|
sref->next = NULL;
|
||||||
sref->server = server;
|
sref->server = server;
|
||||||
// all servers have weight 1.0, when weights are not configured.
|
// all servers have weight 1.0, when weights are not configured.
|
||||||
sref->inv_weight = 1.0;
|
sref->server_weight = 1.0;
|
||||||
sref->connections = 0;
|
sref->connections = 0;
|
||||||
sref->active = true;
|
sref->active = true;
|
||||||
}
|
}
|
||||||
@ -1699,22 +1699,24 @@ static void service_calculate_weights(SERVICE* service)
|
|||||||
char buf[50]; // Enough to hold most numbers
|
char buf[50]; // Enough to hold most numbers
|
||||||
/** Service has a weighting parameter and at least one server */
|
/** Service has a weighting parameter and at least one server */
|
||||||
double total {0};
|
double total {0};
|
||||||
bool weights_are_in_use = false;
|
|
||||||
|
|
||||||
/** Calculate total weight */
|
/** Calculate total weight */
|
||||||
for (SERVER_REF* server = service->dbref; server; server = server->next)
|
for (SERVER_REF* server = service->dbref; server; server = server->next)
|
||||||
{
|
{
|
||||||
if (server_get_parameter(server->server, weightby, buf, sizeof(buf)))
|
if (server_get_parameter(server->server, weightby, buf, sizeof(buf)))
|
||||||
{
|
{
|
||||||
total += atoi(buf);
|
long w = atol(buf);
|
||||||
weights_are_in_use = true;
|
if (w > 0)
|
||||||
|
{
|
||||||
|
total += w;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!weights_are_in_use)
|
if (total == 0)
|
||||||
{
|
{
|
||||||
MXS_WARNING("Weighting Parameter for service '%s' will be ignored as "
|
MXS_WARNING("Weighting parameters for service '%s' will be ignored as "
|
||||||
"no servers have values for the parameter '%s'.",
|
"no servers have (positive) values for the parameter '%s'.",
|
||||||
service->name,
|
service->name,
|
||||||
weightby);
|
weightby);
|
||||||
}
|
}
|
||||||
@ -1725,10 +1727,10 @@ static void service_calculate_weights(SERVICE* service)
|
|||||||
{
|
{
|
||||||
if (server_get_parameter(server->server, weightby, buf, sizeof(buf)))
|
if (server_get_parameter(server->server, weightby, buf, sizeof(buf)))
|
||||||
{
|
{
|
||||||
int config_weight = atoi(buf);
|
long config_weight = atol(buf);
|
||||||
if (config_weight <= 0)
|
if (config_weight <= 0)
|
||||||
{
|
{
|
||||||
MXS_WARNING("Weighting parameter '%s' is set to %d for server '%s'."
|
MXS_WARNING("Weighting parameter '%s' is set to %ld for server '%s'."
|
||||||
" The runtime weight will be set to 0, and the server"
|
" The runtime weight will be set to 0, and the server"
|
||||||
" will only be used if no other servers are available.",
|
" will only be used if no other servers are available.",
|
||||||
weightby,
|
weightby,
|
||||||
@ -1736,7 +1738,7 @@ static void service_calculate_weights(SERVICE* service)
|
|||||||
server->server->name);
|
server->server->name);
|
||||||
config_weight = 0;
|
config_weight = 0;
|
||||||
}
|
}
|
||||||
server->inv_weight = 1.0 - config_weight / total;
|
server->server_weight = config_weight / total;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1745,7 +1747,7 @@ static void service_calculate_weights(SERVICE* service)
|
|||||||
" will only be used if no other servers are available.",
|
" will only be used if no other servers are available.",
|
||||||
weightby,
|
weightby,
|
||||||
server->server->name);
|
server->server->name);
|
||||||
server->inv_weight = 1.0;
|
server->server_weight = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -364,22 +364,21 @@ static MXS_ROUTER_SESSION* newSession(MXS_ROUTER* instance, MXS_SESSION* session
|
|||||||
{
|
{
|
||||||
candidate = ref;
|
candidate = ref;
|
||||||
}
|
}
|
||||||
else if (candidate->connections == 0)
|
else if (ref->server_weight == 0 || candidate->server_weight == 0)
|
||||||
{
|
{
|
||||||
/* The candidate is already as good as it gets. */
|
if (ref->server_weight) // anything with a weight is better
|
||||||
|
{
|
||||||
|
candidate = ref;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (ref->connections == 0)
|
else if (ref->connections / ref->server_weight
|
||||||
{
|
< candidate->connections / candidate->server_weight)
|
||||||
candidate = ref;
|
|
||||||
}
|
|
||||||
else if (ref->inv_weight * ref->connections
|
|
||||||
< candidate->inv_weight * candidate->connections)
|
|
||||||
{
|
{
|
||||||
/* ref has a better score. */
|
/* ref has a better score. */
|
||||||
candidate = ref;
|
candidate = ref;
|
||||||
}
|
}
|
||||||
else if (mxs::almost_equal_server_scores(ref->inv_weight * ref->connections,
|
else if (mxs::almost_equal_server_scores(ref->server_weight * ref->connections,
|
||||||
candidate->inv_weight * candidate->connections)
|
candidate->server_weight * candidate->connections)
|
||||||
&& ref->server->stats.n_connections < candidate->server->stats.n_connections)
|
&& ref->server->stats.n_connections < candidate->server->stats.n_connections)
|
||||||
{
|
{
|
||||||
/* The servers are about equally good, but ref has had fewer connections over time.
|
/* The servers are about equally good, but ref has had fewer connections over time.
|
||||||
@ -712,7 +711,7 @@ static void diagnostics(MXS_ROUTER* router, DCB* dcb)
|
|||||||
dcb_printf(dcb,
|
dcb_printf(dcb,
|
||||||
"\t\t%-20s %3.1f%% %d\n",
|
"\t\t%-20s %3.1f%% %d\n",
|
||||||
ref->server->name,
|
ref->server->name,
|
||||||
(1.0 - ref->inv_weight) * 100,
|
ref->server_weight * 100,
|
||||||
ref->connections);
|
ref->connections);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -887,7 +886,7 @@ static SERVER_REF* get_root_master(SERVER_REF* servers)
|
|||||||
if (ref->active && server_is_master(ref->server))
|
if (ref->active && server_is_master(ref->server))
|
||||||
{
|
{
|
||||||
// No master found yet or this one has better weight.
|
// No master found yet or this one has better weight.
|
||||||
if (master_host == NULL || ref->inv_weight < master_host->inv_weight)
|
if (master_host == NULL || ref->server_weight > master_host->server_weight)
|
||||||
{
|
{
|
||||||
master_host = ref;
|
master_host = ref;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -372,7 +372,7 @@ void RWSplit::diagnostics(DCB* dcb)
|
|||||||
dcb_printf(dcb,
|
dcb_printf(dcb,
|
||||||
"\t\t%-20s %3.1f%% %-6d %-6d %d\n",
|
"\t\t%-20s %3.1f%% %-6d %-6d %d\n",
|
||||||
ref->server->name,
|
ref->server->name,
|
||||||
(1.0 - ref->inv_weight) * 100,
|
ref->server_weight * 100,
|
||||||
ref->server->stats.n_current,
|
ref->server->stats.n_current,
|
||||||
ref->connections,
|
ref->connections,
|
||||||
ref->server->stats.n_current_ops);
|
ref->server->stats.n_current_ops);
|
||||||
|
|||||||
@ -79,7 +79,7 @@ SRWBackendVector::iterator best_score(SRWBackendVector& sBackends,
|
|||||||
SRWBackendVector::iterator backend_cmp_router_conn(SRWBackendVector& sBackends)
|
SRWBackendVector::iterator backend_cmp_router_conn(SRWBackendVector& sBackends)
|
||||||
{
|
{
|
||||||
static auto server_score = [](SERVER_REF* server) {
|
static auto server_score = [](SERVER_REF* server) {
|
||||||
return server->inv_weight * server->connections;
|
return server->server_weight ? server->connections / server->server_weight : 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
return best_score(sBackends, server_score);
|
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)
|
SRWBackendVector::iterator backend_cmp_global_conn(SRWBackendVector& sBackends)
|
||||||
{
|
{
|
||||||
static auto server_score = [](SERVER_REF* server) {
|
static auto server_score = [](SERVER_REF* server) {
|
||||||
return server->inv_weight * server->server->stats.n_current;
|
return server->server_weight ? server->server->stats.n_current / server->server_weight : 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
return best_score(sBackends, server_score);
|
return best_score(sBackends, server_score);
|
||||||
@ -99,7 +99,7 @@ SRWBackendVector::iterator backend_cmp_global_conn(SRWBackendVector& sBackends)
|
|||||||
SRWBackendVector::iterator backend_cmp_behind_master(SRWBackendVector& sBackends)
|
SRWBackendVector::iterator backend_cmp_behind_master(SRWBackendVector& sBackends)
|
||||||
{
|
{
|
||||||
static auto server_score = [](SERVER_REF* server) {
|
static auto server_score = [](SERVER_REF* server) {
|
||||||
return server->inv_weight * server->server->rlag;
|
return server->server_weight ? server->server->rlag / server->server_weight : 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
return best_score(sBackends, server_score);
|
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)
|
SRWBackendVector::iterator backend_cmp_current_load(SRWBackendVector& sBackends)
|
||||||
{
|
{
|
||||||
static auto server_score = [](SERVER_REF* server) {
|
static auto server_score = [](SERVER_REF* server) {
|
||||||
return server->inv_weight * server->server->stats.n_current_ops;
|
return server->server_weight ? server->server->stats.n_current_ops / server->server_weight : 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
return best_score(sBackends, server_score);
|
return best_score(sBackends, server_score);
|
||||||
|
|||||||
Reference in New Issue
Block a user