Refactor auxiliary routing functions
Refactored some of the functions used to calculate servers. Removed redundant checks and moved the ack_write() call to the right place.
This commit is contained in:
@ -102,11 +102,10 @@ static const MXS_ENUM_VALUE master_failure_mode_values[] =
|
|||||||
* @param rses Router client session
|
* @param rses Router client session
|
||||||
* @param router_nservers The number of backend servers in total
|
* @param router_nservers The number of backend servers in total
|
||||||
*/
|
*/
|
||||||
int rses_get_max_slavecount(ROUTER_CLIENT_SES *rses,
|
int rses_get_max_slavecount(ROUTER_CLIENT_SES *rses)
|
||||||
int router_nservers)
|
|
||||||
{
|
{
|
||||||
int conf_max_nslaves;
|
int conf_max_nslaves;
|
||||||
int max_nslaves;
|
int router_nservers = rses->rses_nbackends;
|
||||||
|
|
||||||
CHK_CLIENT_RSES(rses);
|
CHK_CLIENT_RSES(rses);
|
||||||
|
|
||||||
@ -118,9 +117,8 @@ int rses_get_max_slavecount(ROUTER_CLIENT_SES *rses,
|
|||||||
{
|
{
|
||||||
conf_max_nslaves = (router_nservers * rses->rses_config.rw_max_slave_conn_percent) / 100;
|
conf_max_nslaves = (router_nservers * rses->rses_config.rw_max_slave_conn_percent) / 100;
|
||||||
}
|
}
|
||||||
max_nslaves = MXS_MIN(router_nservers - 1, MXS_MAX(1, conf_max_nslaves));
|
|
||||||
|
|
||||||
return max_nslaves;
|
return MXS_MIN(router_nservers - 1, MXS_MAX(1, conf_max_nslaves));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -474,7 +472,7 @@ static bool handle_error_new_connection(ROUTER_INSTANCE *inst,
|
|||||||
/** Close the current connection */
|
/** Close the current connection */
|
||||||
bref->close();
|
bref->close();
|
||||||
|
|
||||||
int max_nslaves = rses_get_max_slavecount(myrses, myrses->rses_nbackends);
|
int max_nslaves = rses_get_max_slavecount(myrses);
|
||||||
bool succp;
|
bool succp;
|
||||||
/**
|
/**
|
||||||
* Try to get replacement slave or at least the minimum
|
* Try to get replacement slave or at least the minimum
|
||||||
@ -796,10 +794,11 @@ static MXS_ROUTER_SESSION *newSession(MXS_ROUTER *router_inst, MXS_SESSION *sess
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int max_nslaves = rses_get_max_slavecount(client_rses, router_nservers);
|
|
||||||
|
|
||||||
client_rses->rses_nbackends = router_nservers; /*< # of backend servers */
|
client_rses->rses_nbackends = router_nservers; /*< # of backend servers */
|
||||||
|
|
||||||
|
int max_nslaves = rses_get_max_slavecount(client_rses);
|
||||||
|
|
||||||
|
|
||||||
if (!select_connect_backend_servers(router_nservers, max_nslaves,
|
if (!select_connect_backend_servers(router_nservers, max_nslaves,
|
||||||
client_rses->rses_config.slave_selection_criteria,
|
client_rses->rses_config.slave_selection_criteria,
|
||||||
session, router, client_rses, false))
|
session, router, client_rses, false))
|
||||||
@ -1122,7 +1121,8 @@ static void clientReply(MXS_ROUTER *instance,
|
|||||||
|
|
||||||
if (reply_is_complete(bref, writebuf))
|
if (reply_is_complete(bref, writebuf))
|
||||||
{
|
{
|
||||||
/** Got a complete reply, decrement expected response count */
|
/** Got a complete reply, acknowledge the write decrement expected response count */
|
||||||
|
bref->ack_write();
|
||||||
router_cli_ses->expected_responses--;
|
router_cli_ses->expected_responses--;
|
||||||
ss_dassert(router_cli_ses->expected_responses >= 0);
|
ss_dassert(router_cli_ses->expected_responses >= 0);
|
||||||
ss_dassert(bref->get_reply_state() == REPLY_STATE_DONE);
|
ss_dassert(bref->get_reply_state() == REPLY_STATE_DONE);
|
||||||
@ -1140,33 +1140,23 @@ static void clientReply(MXS_ROUTER *instance,
|
|||||||
{
|
{
|
||||||
check_session_command_reply(writebuf, bref);
|
check_session_command_reply(writebuf, bref);
|
||||||
|
|
||||||
if (GWBUF_IS_TYPE_SESCMD_RESPONSE(writebuf))
|
/** This discards all responses that have already been sent to the client */
|
||||||
{
|
bool rconn = false;
|
||||||
/**
|
process_sescmd_response(router_cli_ses, bref, &writebuf, &rconn);
|
||||||
* Discard all those responses that have already been sent to
|
|
||||||
* the client. Return with buffer including response that
|
|
||||||
* needs to be sent to client or NULL.
|
|
||||||
*/
|
|
||||||
bool rconn = false;
|
|
||||||
process_sescmd_response(router_cli_ses, bref, &writebuf, &rconn);
|
|
||||||
|
|
||||||
if (rconn && !router_inst->rwsplit_config.disable_sescmd_history)
|
if (rconn && !router_inst->rwsplit_config.disable_sescmd_history)
|
||||||
{
|
{
|
||||||
select_connect_backend_servers(
|
select_connect_backend_servers(
|
||||||
router_cli_ses->rses_nbackends,
|
router_cli_ses->rses_nbackends,
|
||||||
router_cli_ses->rses_config.max_slave_connections,
|
router_cli_ses->rses_config.max_slave_connections,
|
||||||
router_cli_ses->rses_config.slave_selection_criteria,
|
router_cli_ses->rses_config.slave_selection_criteria,
|
||||||
router_cli_ses->client_dcb->session,
|
router_cli_ses->client_dcb->session,
|
||||||
router_cli_ses->router,
|
router_cli_ses->router,
|
||||||
router_cli_ses,
|
router_cli_ses,
|
||||||
true);
|
true);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Complete the write */
|
|
||||||
bref->ack_write();
|
|
||||||
|
|
||||||
bool queue_routed = false;
|
bool queue_routed = false;
|
||||||
|
|
||||||
if (router_cli_ses->expected_responses == 0)
|
if (router_cli_ses->expected_responses == 0)
|
||||||
|
@ -52,7 +52,7 @@ bool send_readonly_error(DCB *dcb);
|
|||||||
*/
|
*/
|
||||||
int router_handle_state_switch(DCB *dcb, DCB_REASON reason, void *data);
|
int router_handle_state_switch(DCB *dcb, DCB_REASON reason, void *data);
|
||||||
SRWBackend& get_bref_from_dcb(ROUTER_CLIENT_SES *rses, DCB *dcb);
|
SRWBackend& get_bref_from_dcb(ROUTER_CLIENT_SES *rses, DCB *dcb);
|
||||||
int rses_get_max_slavecount(ROUTER_CLIENT_SES *rses, int router_nservers);
|
int rses_get_max_slavecount(ROUTER_CLIENT_SES *rses);
|
||||||
int rses_get_max_replication_lag(ROUTER_CLIENT_SES *rses);
|
int rses_get_max_replication_lag(ROUTER_CLIENT_SES *rses);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -79,8 +79,8 @@ static bool valid_for_slave(const SERVER *server, const SERVER *master_host)
|
|||||||
* @param cmpfun qsort() compatible comparison function
|
* @param cmpfun qsort() compatible comparison function
|
||||||
* @return The best slave backend reference or NULL if no candidates could be found
|
* @return The best slave backend reference or NULL if no candidates could be found
|
||||||
*/
|
*/
|
||||||
SRWBackend* get_slave_candidate(ROUTER_CLIENT_SES* rses, const SERVER *master,
|
SRWBackend get_slave_candidate(ROUTER_CLIENT_SES* rses, const SERVER *master,
|
||||||
int (*cmpfun)(const void *, const void *))
|
int (*cmpfun)(const void *, const void *))
|
||||||
{
|
{
|
||||||
SRWBackend candidate;
|
SRWBackend candidate;
|
||||||
|
|
||||||
@ -210,7 +210,7 @@ bool select_connect_backend_servers(int router_nservers,
|
|||||||
ss_dassert(slaves_connected < max_nslaves || max_nslaves == 0);
|
ss_dassert(slaves_connected < max_nslaves || max_nslaves == 0);
|
||||||
|
|
||||||
/** Connect to all possible slaves */
|
/** Connect to all possible slaves */
|
||||||
for (SRWBackend bref(get_slave_candidate(rses, router_nservers, master_host, cmpfun));
|
for (SRWBackend bref(get_slave_candidate(rses, master_host, cmpfun));
|
||||||
bref && slaves_connected < max_nslaves;
|
bref && slaves_connected < max_nslaves;
|
||||||
bref = get_slave_candidate(rses, master_host, cmpfun))
|
bref = get_slave_candidate(rses, master_host, cmpfun))
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user