Fix slave reconnection logic

Allowing calls to select_connect_backend_servers even when all slaves are
connected solves the debug assertion in select_connect_backend_servers
that happens when the execution of a queued query causes a new connection
to be created.
This commit is contained in:
Markus Mäkelä
2018-06-13 12:44:09 +03:00
parent 3ed6411741
commit 2005164222
4 changed files with 27 additions and 13 deletions

View File

@ -343,25 +343,36 @@ bool RWSplit::select_connect_backend_servers(MXS_SESSION *session,
int slaves_connected = counts.second;
int max_nslaves = max_slave_count();
ss_dassert(slaves_connected < max_nslaves || max_nslaves == 0);
ss_dassert(slaves_connected <= max_nslaves || max_nslaves == 0);
/** Connect to all possible slaves */
for (SRWBackend backend(get_slave_candidate(backends, master, cmpfun));
backend && slaves_connected < max_nslaves;
backend = get_slave_candidate(backends, master, cmpfun))
if (slaves_connected < max_nslaves)
{
if (backend->can_connect() && backend->connect(session, sescmd_list))
/** Connect to all possible slaves */
for (SRWBackend backend(get_slave_candidate(backends, master, cmpfun));
backend && slaves_connected < max_nslaves;
backend = get_slave_candidate(backends, master, cmpfun))
{
MXS_INFO("Selected Slave: %s", backend->name());
if (sescmd_list && sescmd_list->size() && expected_responses)
if (backend->can_connect() && backend->connect(session, sescmd_list))
{
(*expected_responses)++;
}
MXS_INFO("Selected Slave: %s", backend->name());
slaves_connected++;
if (sescmd_list && sescmd_list->size() && expected_responses)
{
(*expected_responses)++;
}
slaves_connected++;
}
}
}
else
{
/**
* We are already connected to all possible slaves. Currently this can
* only happen if this function is called by handle_error_new_connection
* and the routing of queued queries created new connections.
*/
}
return true;
}