MXS-2702: Update m_current_master on session command
When lazy_connect is enabled and the first query is `SET autocommit=0`, a master connection can be created. If it is, then the m_current_master pointer must also be updated. Also fixed the case where a failure to connect to one slave would cause the connection attempts to stop too early.
This commit is contained in:
@ -105,21 +105,32 @@ bool RWSplitSession::prepare_target(RWBackend* target, route_target_t route_targ
|
|||||||
|
|
||||||
bool RWSplitSession::create_one_connection()
|
bool RWSplitSession::create_one_connection()
|
||||||
{
|
{
|
||||||
|
mxb_assert(m_config.lazy_connect);
|
||||||
|
|
||||||
// Try to first find a master
|
// Try to first find a master
|
||||||
for (auto backend : m_raw_backends)
|
for (auto backend : m_raw_backends)
|
||||||
{
|
{
|
||||||
if (backend->can_connect() && backend->is_master())
|
if (backend->can_connect() && backend->is_master())
|
||||||
{
|
{
|
||||||
return prepare_target(backend, TARGET_MASTER);
|
if (prepare_target(backend, TARGET_MASTER))
|
||||||
|
{
|
||||||
|
if (!m_current_master)
|
||||||
|
{
|
||||||
|
MXS_INFO("Chose '%s' as master due to session write", backend->name());
|
||||||
|
m_current_master = backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no master was found, find a slave
|
// If no master was found, find a slave
|
||||||
for (auto backend : m_raw_backends)
|
for (auto backend : m_raw_backends)
|
||||||
{
|
{
|
||||||
if (backend->can_connect() && backend->is_slave())
|
if (backend->can_connect() && backend->is_slave() && prepare_target(backend, TARGET_SLAVE))
|
||||||
{
|
{
|
||||||
return prepare_target(backend, TARGET_SLAVE);
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user