Allow master changes at transaction start

When a BEGIN statement is being executed without a master connection but
when one can be created, the BEGIN statement would be treated as if a
transaction was already open. Since the statement only starts the
transaction, it is allowed to be routed to a "new" master regardless of
the transaction statem.

This fixes the failure to start a transaction when lazy_connect is
enabled.
This commit is contained in:
Markus Mäkelä
2019-05-07 12:43:58 +03:00
parent ef25eceb78
commit b0d8535ead
2 changed files with 8 additions and 1 deletions

View File

@ -928,13 +928,19 @@ void RWSplitSession::log_master_routing_failure(bool found,
errmsg);
}
bool RWSplitSession::trx_is_starting()
{
return session_trx_is_active(m_client->session)
&& qc_query_is_type(m_qc.current_route_info().type_mask(), QUERY_TYPE_BEGIN_TRX);
}
bool RWSplitSession::should_replace_master(RWBackend* target)
{
return m_config.master_reconnection
&& // We have a target server and it's not the current master
target && target != m_current_master
&& // We are not inside a transaction (also checks for autocommit=1)
(!session_trx_is_active(m_client->session) || m_is_replay_active)
(!session_trx_is_active(m_client->session) || trx_is_starting() || m_is_replay_active)
&& // We are not locked to the old master
!is_locked_to_master();
}

View File

@ -166,6 +166,7 @@ private:
bool create_one_connection();
void retry_query(GWBUF* querybuf, int delay = 1);
bool trx_is_starting();
bool should_replace_master(mxs::RWBackend* target);
void replace_master(mxs::RWBackend* target);
bool should_migrate_trx(mxs::RWBackend* target);