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);
|
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)
|
bool RWSplitSession::should_replace_master(RWBackend* target)
|
||||||
{
|
{
|
||||||
return m_config.master_reconnection
|
return m_config.master_reconnection
|
||||||
&& // We have a target server and it's not the current master
|
&& // We have a target server and it's not the current master
|
||||||
target && target != m_current_master
|
target && target != m_current_master
|
||||||
&& // We are not inside a transaction (also checks for autocommit=1)
|
&& // 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
|
&& // We are not locked to the old master
|
||||||
!is_locked_to_master();
|
!is_locked_to_master();
|
||||||
}
|
}
|
||||||
|
@ -166,6 +166,7 @@ private:
|
|||||||
bool create_one_connection();
|
bool create_one_connection();
|
||||||
void retry_query(GWBUF* querybuf, int delay = 1);
|
void retry_query(GWBUF* querybuf, int delay = 1);
|
||||||
|
|
||||||
|
bool trx_is_starting();
|
||||||
bool should_replace_master(mxs::RWBackend* target);
|
bool should_replace_master(mxs::RWBackend* target);
|
||||||
void replace_master(mxs::RWBackend* target);
|
void replace_master(mxs::RWBackend* target);
|
||||||
bool should_migrate_trx(mxs::RWBackend* target);
|
bool should_migrate_trx(mxs::RWBackend* target);
|
||||||
|
Reference in New Issue
Block a user