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