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:
@ -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.
|
||||||
|
Reference in New Issue
Block a user