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