Reassing master reference after sorting backends

The master reference used by the readwritesplit sessions needs to be
reassigned if slave reconnection occurs. This happens because the
reference refers to a certain place in the backend reference array
instead of the actual backend reference and those places are mixed
when the array is sorted.
This commit is contained in:
Markus Makela
2016-11-09 07:50:31 +02:00
parent 7f500feb9d
commit 8d893b4e56

View File

@ -3092,11 +3092,26 @@ static bool select_connect_backend_servers(backend_ref_t **p_master_ref,
int (*p)(const void *, const void *) = criteria_cmpfun[select_criteria];
ss_dassert(p);
SERVER *old_master = *p_master_ref ? (*p_master_ref)->bref_backend->backend_server : NULL;
/** Sort the pointer list to servers according to slave selection criteria.
* The servers that match the criteria the best are at the beginning of
* the list. */
qsort(backend_ref, (size_t) router_nservers, sizeof(backend_ref_t), p);
if (master_connected && old_master)
{
/** We sorted the array so the pointer to the old master was changed and
* we need to find the old master again. */
for (int i = 0; i < router_nservers; i++)
{
if (backend_ref[i].bref_backend->backend_server == old_master)
{
*p_master_ref = &backend_ref[i];
}
}
}
if (MXS_LOG_PRIORITY_IS_ENABLED(LOG_INFO))
{
log_server_connections(select_criteria, backend_ref, router_nservers);