MXS-2025 Use PRWBackends in backend selection.
This commit is contained in:
@ -132,9 +132,7 @@ static const char gtid_wait_stmt[] =
|
|||||||
/** Function that returns a "score" for a server to enable comparison.
|
/** Function that returns a "score" for a server to enable comparison.
|
||||||
* Smaller numbers are better.
|
* Smaller numbers are better.
|
||||||
*/
|
*/
|
||||||
using SRWBackendVector = std::vector<mxs::RWBackend**>;
|
using BackendSelectFunction = std::function<mxs::PRWBackends::iterator (mxs::PRWBackends& sBackends)>;
|
||||||
using BackendSelectFunction = std::function
|
|
||||||
<SRWBackendVector::iterator (SRWBackendVector& sBackends)>;
|
|
||||||
BackendSelectFunction get_backend_select_function(select_criteria_t);
|
BackendSelectFunction get_backend_select_function(select_criteria_t);
|
||||||
|
|
||||||
struct Config
|
struct Config
|
||||||
@ -416,7 +414,7 @@ std::pair<int, int> get_slave_counts(mxs::PRWBackends& backends, mxs::RWBackend*
|
|||||||
*
|
*
|
||||||
* @return Valid iterator into argument backends, or end(backends) if empty
|
* @return Valid iterator into argument backends, or end(backends) if empty
|
||||||
*/
|
*/
|
||||||
SRWBackendVector::iterator find_best_backend(SRWBackendVector& backends,
|
mxs::PRWBackends::iterator find_best_backend(mxs::PRWBackends& backends,
|
||||||
BackendSelectFunction select,
|
BackendSelectFunction select,
|
||||||
bool masters_accepts_reads);
|
bool masters_accepts_reads);
|
||||||
|
|
||||||
|
@ -578,7 +578,7 @@ RWBackend* RWSplitSession::get_slave_backend(int max_rlag)
|
|||||||
{
|
{
|
||||||
// create a list of useable backends (includes masters, function name is a bit off),
|
// create a list of useable backends (includes masters, function name is a bit off),
|
||||||
// then feed that list to compare.
|
// then feed that list to compare.
|
||||||
SRWBackendVector candidates;
|
PRWBackends candidates;
|
||||||
auto counts = get_slave_counts(m_backends, m_current_master);
|
auto counts = get_slave_counts(m_backends, m_current_master);
|
||||||
|
|
||||||
for (auto& backend : m_backends)
|
for (auto& backend : m_backends)
|
||||||
@ -597,15 +597,15 @@ RWBackend* RWSplitSession::get_slave_backend(int max_rlag)
|
|||||||
|
|
||||||
if (server_is_candidate)
|
if (server_is_candidate)
|
||||||
{
|
{
|
||||||
candidates.push_back(&backend);
|
candidates.push_back(backend);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SRWBackendVector::const_iterator rval = find_best_backend(candidates,
|
PRWBackends::const_iterator rval = find_best_backend(candidates,
|
||||||
m_config.backend_select_fct,
|
m_config.backend_select_fct,
|
||||||
m_config.master_accept_reads);
|
m_config.master_accept_reads);
|
||||||
|
|
||||||
return (rval == candidates.end()) ? nullptr : **rval;
|
return (rval == candidates.end()) ? nullptr : *rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
RWBackend* RWSplitSession::get_master_backend()
|
RWBackend* RWSplitSession::get_master_backend()
|
||||||
|
@ -57,14 +57,14 @@ static bool valid_for_slave(const RWBackend* backend, const RWBackend* master)
|
|||||||
&& (!master || backend != master);
|
&& (!master || backend != master);
|
||||||
}
|
}
|
||||||
|
|
||||||
SRWBackendVector::iterator best_score(SRWBackendVector& sBackends,
|
PRWBackends::iterator best_score(PRWBackends& sBackends,
|
||||||
std::function<double(SERVER_REF* server)> server_score)
|
std::function<double(SERVER_REF* server)> server_score)
|
||||||
{
|
{
|
||||||
double min {std::numeric_limits<double>::max()};
|
double min {std::numeric_limits<double>::max()};
|
||||||
auto best = sBackends.end();
|
auto best = sBackends.end();
|
||||||
for (auto ite = sBackends.begin(); ite != sBackends.end(); ++ite)
|
for (auto ite = sBackends.begin(); ite != sBackends.end(); ++ite)
|
||||||
{
|
{
|
||||||
double score = server_score((***ite).backend());
|
double score = server_score((**ite).backend());
|
||||||
if (min > score)
|
if (min > score)
|
||||||
{
|
{
|
||||||
min = score;
|
min = score;
|
||||||
@ -76,7 +76,7 @@ SRWBackendVector::iterator best_score(SRWBackendVector& sBackends,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Compare number of connections from this router in backend servers */
|
/** Compare number of connections from this router in backend servers */
|
||||||
SRWBackendVector::iterator backend_cmp_router_conn(SRWBackendVector& sBackends)
|
PRWBackends::iterator backend_cmp_router_conn(PRWBackends& sBackends)
|
||||||
{
|
{
|
||||||
static auto server_score = [](SERVER_REF* server) {
|
static auto server_score = [](SERVER_REF* server) {
|
||||||
return server->server_weight ? (server->connections + 1) / server->server_weight :
|
return server->server_weight ? (server->connections + 1) / server->server_weight :
|
||||||
@ -87,7 +87,7 @@ SRWBackendVector::iterator backend_cmp_router_conn(SRWBackendVector& sBackends)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Compare number of global connections in backend servers */
|
/** Compare number of global connections in backend servers */
|
||||||
SRWBackendVector::iterator backend_cmp_global_conn(SRWBackendVector& sBackends)
|
PRWBackends::iterator backend_cmp_global_conn(PRWBackends& sBackends)
|
||||||
{
|
{
|
||||||
static auto server_score = [](SERVER_REF* server) {
|
static auto server_score = [](SERVER_REF* server) {
|
||||||
return server->server_weight ? (server->server->stats.n_current + 1) / server->server_weight :
|
return server->server_weight ? (server->server->stats.n_current + 1) / server->server_weight :
|
||||||
@ -98,7 +98,7 @@ SRWBackendVector::iterator backend_cmp_global_conn(SRWBackendVector& sBackends)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Compare replication lag between backend servers */
|
/** Compare replication lag between backend servers */
|
||||||
SRWBackendVector::iterator backend_cmp_behind_master(SRWBackendVector& sBackends)
|
PRWBackends::iterator backend_cmp_behind_master(PRWBackends& sBackends)
|
||||||
{
|
{
|
||||||
static auto server_score = [](SERVER_REF* server) {
|
static auto server_score = [](SERVER_REF* server) {
|
||||||
return server->server_weight ? server->server->rlag / server->server_weight :
|
return server->server_weight ? server->server->rlag / server->server_weight :
|
||||||
@ -109,7 +109,7 @@ SRWBackendVector::iterator backend_cmp_behind_master(SRWBackendVector& sBackends
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Compare number of current operations in backend servers */
|
/** Compare number of current operations in backend servers */
|
||||||
SRWBackendVector::iterator backend_cmp_current_load(SRWBackendVector& sBackends)
|
PRWBackends::iterator backend_cmp_current_load(PRWBackends& sBackends)
|
||||||
{
|
{
|
||||||
static auto server_score = [](SERVER_REF* server) {
|
static auto server_score = [](SERVER_REF* server) {
|
||||||
return server->server_weight ? (server->server->stats.n_current_ops + 1) / server->server_weight :
|
return server->server_weight ? (server->server->stats.n_current_ops + 1) / server->server_weight :
|
||||||
@ -119,7 +119,7 @@ SRWBackendVector::iterator backend_cmp_current_load(SRWBackendVector& sBackends)
|
|||||||
return best_score(sBackends, server_score);
|
return best_score(sBackends, server_score);
|
||||||
}
|
}
|
||||||
|
|
||||||
SRWBackendVector::iterator backend_cmp_response_time(SRWBackendVector& sBackends)
|
PRWBackends::iterator backend_cmp_response_time(PRWBackends& sBackends)
|
||||||
{
|
{
|
||||||
const int SZ = sBackends.size();
|
const int SZ = sBackends.size();
|
||||||
double slot[SZ];
|
double slot[SZ];
|
||||||
@ -128,7 +128,7 @@ SRWBackendVector::iterator backend_cmp_response_time(SRWBackendVector& sBackends
|
|||||||
double pre_total {0};
|
double pre_total {0};
|
||||||
for (int i = 0; i < SZ; ++i)
|
for (int i = 0; i < SZ; ++i)
|
||||||
{
|
{
|
||||||
SERVER_REF* server = (**sBackends[i]).backend();
|
SERVER_REF* server = (*sBackends[i]).backend();
|
||||||
double ave = server_response_time_average(server->server);
|
double ave = server_response_time_average(server->server);
|
||||||
|
|
||||||
if (ave == 0)
|
if (ave == 0)
|
||||||
@ -211,17 +211,17 @@ BackendSelectFunction get_backend_select_function(select_criteria_t sc)
|
|||||||
*
|
*
|
||||||
* @return iterator to the best slave or backends.end() if none found
|
* @return iterator to the best slave or backends.end() if none found
|
||||||
*/
|
*/
|
||||||
SRWBackendVector::iterator find_best_backend(SRWBackendVector& backends,
|
PRWBackends::iterator find_best_backend(PRWBackends& backends,
|
||||||
BackendSelectFunction select,
|
BackendSelectFunction select,
|
||||||
bool masters_accepts_reads)
|
bool masters_accepts_reads)
|
||||||
{
|
{
|
||||||
// Group backends by priority. The set of highest priority backends will then compete.
|
// Group backends by priority. The set of highest priority backends will then compete.
|
||||||
std::map<int, SRWBackendVector> priority_map;
|
std::map<int, PRWBackends> priority_map;
|
||||||
int best_priority {INT_MAX}; // low numbers are high priority
|
int best_priority {INT_MAX}; // low numbers are high priority
|
||||||
|
|
||||||
for (auto& psBackend : backends)
|
for (auto& psBackend : backends)
|
||||||
{
|
{
|
||||||
auto& backend = **psBackend;
|
auto& backend = *psBackend;
|
||||||
bool is_busy = backend.in_use() && backend.has_session_commands();
|
bool is_busy = backend.in_use() && backend.has_session_commands();
|
||||||
bool acts_slave = backend.is_slave() || (backend.is_master() && masters_accepts_reads);
|
bool acts_slave = backend.is_slave() || (backend.is_master() && masters_accepts_reads);
|
||||||
|
|
||||||
@ -420,14 +420,14 @@ bool RWSplit::select_connect_backend_servers(MXS_SESSION* session,
|
|||||||
|
|
||||||
mxb_assert(slaves_connected <= max_nslaves || max_nslaves == 0);
|
mxb_assert(slaves_connected <= max_nslaves || max_nslaves == 0);
|
||||||
|
|
||||||
SRWBackendVector candidates;
|
PRWBackends candidates;
|
||||||
for (auto& sBackend : backends)
|
for (auto& pBackend : backends)
|
||||||
{
|
{
|
||||||
if (!sBackend->in_use()
|
if (!pBackend->in_use()
|
||||||
&& sBackend->can_connect()
|
&& pBackend->can_connect()
|
||||||
&& valid_for_slave(sBackend, master))
|
&& valid_for_slave(pBackend, master))
|
||||||
{
|
{
|
||||||
candidates.push_back(&sBackend);
|
candidates.push_back(pBackend);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -439,7 +439,7 @@ bool RWSplit::select_connect_backend_servers(MXS_SESSION* session,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& backend = **ite;
|
auto& backend = *ite;
|
||||||
|
|
||||||
if (backend->connect(session, sescmd_list))
|
if (backend->connect(session, sescmd_list))
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user