MXS-1503: Split get_target_backend into smaller pieces

Split the code into separate functions. This should make it easier to
comprehend.
This commit is contained in:
Markus Mäkelä
2018-03-28 12:32:17 +03:00
parent 9c7578272c
commit 3d63d18bdd

View File

@ -353,59 +353,30 @@ static inline bool rpl_lag_is_ok(SRWBackend& backend, int max_rlag)
backend->server()->rlag <= max_rlag); backend->server()->rlag <= max_rlag);
} }
/** SRWBackend get_hinted_backend(RWSplitSession *rses, char *name)
* Provide the router with a reference to a suitable backend
*
* @param rses Pointer to router client session
* @param btype Backend type
* @param name Name of the backend which is primarily searched. May be NULL.
* @param max_rlag Maximum replication lag
* @param target The target backend
*
* @return True if a backend was found
*/
SRWBackend get_target_backend(RWSplitSession *rses, backend_type_t btype,
char *name, int max_rlag)
{ {
CHK_CLIENT_RSES(rses);
/** Check whether using rses->target_node as target SLAVE */
if (rses->target_node && session_trx_is_read_only(rses->client_dcb->session))
{
MXS_DEBUG("In READ ONLY transaction, using server '%s'",
rses->target_node->name());
return rses->target_node;
}
if (name) /*< Choose backend by name from a hint */
{
ss_dassert(btype != BE_MASTER); /*< Master dominates and no name should be passed with it */
for (SRWBackendList::iterator it = rses->backends.begin();
it != rses->backends.end(); it++)
{
SRWBackend& backend = *it;
/** The server must be a valid slave, relay server, or master */
if (backend->in_use() &&
(strcasecmp(name, backend->name()) == 0) &&
(backend->is_slave() ||
backend->is_relay() ||
backend->is_master()))
{
return backend;
}
}
/** No server found, use a normal slave for it */
btype = BE_SLAVE;
}
SRWBackend rval; SRWBackend rval;
if (btype == BE_SLAVE) for (auto it = rses->backends.begin(); it != rses->backends.end(); it++)
{ {
auto& backend = *it;
/** The server must be a valid slave, relay server, or master */
if (backend->in_use() && strcasecmp(name, backend->name()) == 0 &&
(backend->is_slave() || backend->is_relay() || backend->is_master()))
{
rval = backend;
break;
}
}
return rval;
}
SRWBackend get_slave_backend(RWSplitSession *rses, int max_rlag)
{
SRWBackend rval;
for (auto it = rses->backends.begin(); it != rses->backends.end(); it++) for (auto it = rses->backends.begin(); it != rses->backends.end(); it++)
{ {
auto& backend = *it; auto& backend = *it;
@ -438,13 +409,13 @@ SRWBackend get_target_backend(RWSplitSession *rses, backend_type_t btype,
} }
} }
} }
}
/** return rval;
* If target was originally master only then the execution jumps }
* directly here.
*/ SRWBackend get_master_backend(RWSplitSession *rses)
else if (btype == BE_MASTER) {
{ SRWBackend rval;
/** get root master from available servers */ /** get root master from available servers */
SRWBackend master = get_root_master(rses->backends); SRWBackend master = get_root_master(rses->backends);
@ -468,6 +439,49 @@ SRWBackend get_target_backend(RWSplitSession *rses, backend_type_t btype,
master->name()); master->name());
} }
} }
return rval;
}
/**
* Provide the router with a reference to a suitable backend
*
* @param rses Pointer to router client session
* @param btype Backend type
* @param name Name of the backend which is primarily searched. May be NULL.
* @param max_rlag Maximum replication lag
* @param target The target backend
*
* @return True if a backend was found
*/
SRWBackend get_target_backend(RWSplitSession *rses, backend_type_t btype,
char *name, int max_rlag)
{
CHK_CLIENT_RSES(rses);
/** Check whether using rses->target_node as target SLAVE */
if (rses->target_node && session_trx_is_read_only(rses->client_dcb->session))
{
MXS_DEBUG("In READ ONLY transaction, using server '%s'", rses->target_node->name());
return rses->target_node;
}
SRWBackend rval;
if (name) /*< Choose backend by name from a hint */
{
ss_dassert(btype != BE_MASTER);
btype = BE_SLAVE;
rval = get_hinted_backend(rses, name);
}
else if (btype == BE_SLAVE)
{
rval = get_slave_backend(rses, max_rlag);
}
else if (btype == BE_MASTER)
{
rval = get_master_backend(rses);
} }
return rval; return rval;