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