From 7d231e532867ff762abebcb05751b6a1164153f1 Mon Sep 17 00:00:00 2001 From: Niclas Antti Date: Mon, 24 Sep 2018 12:05:47 +0300 Subject: [PATCH] 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. --- include/maxscale/service.h | 2 +- server/core/service.cc | 24 ++++++++++--------- .../routing/readconnroute/readconnroute.cc | 23 +++++++++--------- .../routing/readwritesplit/readwritesplit.cc | 2 +- .../readwritesplit/rwsplit_select_backends.cc | 8 +++---- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/include/maxscale/service.h b/include/maxscale/service.h index ac80c0dab..6221f03c2 100644 --- a/include/maxscale/service.h +++ b/include/maxscale/service.h @@ -63,7 +63,7 @@ typedef struct server_ref_t { struct server_ref_t* next; /**< Next server reference */ 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 */ bool active; /**< Whether this reference is valid and in use*/ } SERVER_REF; diff --git a/server/core/service.cc b/server/core/service.cc index 7260fd07f..b2d0576d1 100644 --- a/server/core/service.cc +++ b/server/core/service.cc @@ -947,7 +947,7 @@ static SERVER_REF* server_ref_create(SERVER* server) sref->next = NULL; sref->server = server; // 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->active = true; } @@ -1699,22 +1699,24 @@ static void service_calculate_weights(SERVICE* service) char buf[50]; // Enough to hold most numbers /** Service has a weighting parameter and at least one server */ double total {0}; - bool weights_are_in_use = false; /** Calculate total weight */ for (SERVER_REF* server = service->dbref; server; server = server->next) { if (server_get_parameter(server->server, weightby, buf, sizeof(buf))) { - total += atoi(buf); - weights_are_in_use = true; + long w = atol(buf); + if (w > 0) + { + total += w; + } } } - if (!weights_are_in_use) + if (total == 0) { - MXS_WARNING("Weighting Parameter for service '%s' will be ignored as " - "no servers have values for the parameter '%s'.", + MXS_WARNING("Weighting parameters for service '%s' will be ignored as " + "no servers have (positive) values for the parameter '%s'.", service->name, weightby); } @@ -1725,10 +1727,10 @@ static void service_calculate_weights(SERVICE* service) { if (server_get_parameter(server->server, weightby, buf, sizeof(buf))) { - int config_weight = atoi(buf); + long config_weight = atol(buf); 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" " will only be used if no other servers are available.", weightby, @@ -1736,7 +1738,7 @@ static void service_calculate_weights(SERVICE* service) server->server->name); config_weight = 0; } - server->inv_weight = 1.0 - config_weight / total; + server->server_weight = config_weight / total; } else { @@ -1745,7 +1747,7 @@ static void service_calculate_weights(SERVICE* service) " will only be used if no other servers are available.", weightby, server->server->name); - server->inv_weight = 1.0; + server->server_weight = 0; } } } diff --git a/server/modules/routing/readconnroute/readconnroute.cc b/server/modules/routing/readconnroute/readconnroute.cc index f6f6f057c..7c4bb688b 100644 --- a/server/modules/routing/readconnroute/readconnroute.cc +++ b/server/modules/routing/readconnroute/readconnroute.cc @@ -364,22 +364,21 @@ static MXS_ROUTER_SESSION* newSession(MXS_ROUTER* instance, MXS_SESSION* session { 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) - { - candidate = ref; - } - else if (ref->inv_weight * ref->connections - < candidate->inv_weight * candidate->connections) + else if (ref->connections / ref->server_weight + < candidate->connections / candidate->server_weight) { /* ref has a better score. */ candidate = ref; } - else if (mxs::almost_equal_server_scores(ref->inv_weight * ref->connections, - candidate->inv_weight * candidate->connections) + else if (mxs::almost_equal_server_scores(ref->server_weight * ref->connections, + candidate->server_weight * candidate->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. @@ -712,7 +711,7 @@ static void diagnostics(MXS_ROUTER* router, DCB* dcb) dcb_printf(dcb, "\t\t%-20s %3.1f%% %d\n", ref->server->name, - (1.0 - ref->inv_weight) * 100, + ref->server_weight * 100, ref->connections); } } @@ -887,7 +886,7 @@ static SERVER_REF* get_root_master(SERVER_REF* servers) if (ref->active && server_is_master(ref->server)) { // 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; } diff --git a/server/modules/routing/readwritesplit/readwritesplit.cc b/server/modules/routing/readwritesplit/readwritesplit.cc index fca5e59fc..153dbaff8 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.cc +++ b/server/modules/routing/readwritesplit/readwritesplit.cc @@ -372,7 +372,7 @@ void RWSplit::diagnostics(DCB* dcb) dcb_printf(dcb, "\t\t%-20s %3.1f%% %-6d %-6d %d\n", ref->server->name, - (1.0 - ref->inv_weight) * 100, + ref->server_weight * 100, ref->server->stats.n_current, ref->connections, ref->server->stats.n_current_ops); diff --git a/server/modules/routing/readwritesplit/rwsplit_select_backends.cc b/server/modules/routing/readwritesplit/rwsplit_select_backends.cc index a7d8c5dda..7dafb8cd8 100644 --- a/server/modules/routing/readwritesplit/rwsplit_select_backends.cc +++ b/server/modules/routing/readwritesplit/rwsplit_select_backends.cc @@ -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->inv_weight * server->connections; + return server->server_weight ? server->connections / 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->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); @@ -99,7 +99,7 @@ SRWBackendVector::iterator backend_cmp_global_conn(SRWBackendVector& sBackends) SRWBackendVector::iterator backend_cmp_behind_master(SRWBackendVector& sBackends) { 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); @@ -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->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);