MXS-2313: Use rank in readconnroute

The rank is used for both root master selection as well as normal
candidate selection.
This commit is contained in:
Markus Mäkelä
2019-03-10 06:14:07 +02:00
parent 4f0538a041
commit aeca0f8a31

View File

@ -83,18 +83,29 @@ extern "C" MXS_MODULE* MXS_CREATE_MODULE()
*/ */
SERVER_REF* RCR::get_root_master() SERVER_REF* RCR::get_root_master()
{ {
int best_rank {std::numeric_limits<int>::max()};
SERVER_REF* master_host = nullptr; SERVER_REF* master_host = nullptr;
for (SERVER_REF* ref = m_pService->dbref; ref; ref = ref->next) for (SERVER_REF* ref = m_pService->dbref; ref; ref = ref->next)
{ {
if (server_ref_is_active(ref) && ref->server->is_master()) if (server_ref_is_active(ref) && ref->server->is_master())
{ {
// No master found yet or this one has better weight. int rank = ref->server->rank();
if (!master_host || ref->server_weight > master_host->server_weight)
if (!master_host)
{ {
// No master found yet
master_host = ref;
}
else if (rank < best_rank
|| (rank == best_rank && ref->server_weight > master_host->server_weight))
{
best_rank = rank;
master_host = ref; master_host = ref;
} }
} }
} }
return master_host; return master_host;
} }
@ -219,6 +230,7 @@ RCRSession* RCR::newSession(MXS_SESSION* session)
* connection router. * connection router.
*/ */
SERVER_REF* candidate = nullptr; SERVER_REF* candidate = nullptr;
int best_rank {std::numeric_limits<int>::max()};
/* /*
* Loop over all the servers and find any that have fewer connections * Loop over all the servers and find any that have fewer connections
@ -276,11 +288,14 @@ RCRSession* RCR::newSession(MXS_SESSION* session)
} }
/* If no candidate set, set first running server as our initial candidate server */ /* If no candidate set, set first running server as our initial candidate server */
if (!candidate) if (!candidate || ref->server->rank() < best_rank)
{ {
best_rank = ref->server->rank();
candidate = ref; candidate = ref;
} }
else if (ref->server_weight == 0 || candidate->server_weight == 0) else if (ref->server->rank() == best_rank)
{
if (ref->server_weight == 0 || candidate->server_weight == 0)
{ {
if (ref->server_weight) // anything with a weight is better if (ref->server_weight) // anything with a weight is better
{ {
@ -295,6 +310,7 @@ RCRSession* RCR::newSession(MXS_SESSION* session)
} }
} }
} }
}
/* If we haven't found a proper candidate yet but a master server is available, we'll pick that /* If we haven't found a proper candidate yet but a master server is available, we'll pick that
* with the assumption that it is "better" than a slave. * with the assumption that it is "better" than a slave.