MXS-2295: Keep the COM_CHANGE_USER command
If the whole session command history is cleared, the COM_CHANGE_USER is lost and the connections can end up using different users.
This commit is contained in:
@ -165,14 +165,28 @@ void RWSplitSession::process_sescmd_response(SRWBackend& backend, GWBUF** ppPack
|
|||||||
if (m_expected_responses == 0
|
if (m_expected_responses == 0
|
||||||
&& (command == MXS_COM_CHANGE_USER || command == MXS_COM_RESET_CONNECTION))
|
&& (command == MXS_COM_CHANGE_USER || command == MXS_COM_RESET_CONNECTION))
|
||||||
{
|
{
|
||||||
|
mxb_assert_message(m_slave_responses.empty(), "All responses should've been processed");
|
||||||
// This is the last session command to finish that resets the session state, reset the history
|
// This is the last session command to finish that resets the session state, reset the history
|
||||||
MXS_INFO("Resetting session command history (length: %lu)", m_sescmd_list.size());
|
MXS_INFO("Resetting session command history (length: %lu)", m_sescmd_list.size());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Since new connections need to perform the COM_CHANGE_USER, pop it off the list along
|
||||||
|
* with the expected response to it.
|
||||||
|
*/
|
||||||
|
SSessionCommand latest = m_sescmd_list.back();
|
||||||
|
cmd = m_sescmd_responses[latest->get_position()];
|
||||||
|
|
||||||
m_sescmd_list.clear();
|
m_sescmd_list.clear();
|
||||||
m_sescmd_responses.clear();
|
m_sescmd_responses.clear();
|
||||||
m_slave_responses.clear();
|
|
||||||
m_recv_sescmd = 0;
|
// Push the response back as the first executed session command
|
||||||
m_sent_sescmd = 0;
|
m_sescmd_list.push_back(latest);
|
||||||
m_sescmd_count = 1;
|
m_sescmd_responses[latest->get_position()] = cmd;
|
||||||
|
|
||||||
|
// Adjust counters to match the number of stored session commands
|
||||||
|
m_recv_sescmd = 1;
|
||||||
|
m_sent_sescmd = 1;
|
||||||
|
m_sescmd_count = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -139,7 +139,7 @@ public:
|
|||||||
int m_last_keepalive_check; /**< When the last ping was done */
|
int m_last_keepalive_check; /**< When the last ping was done */
|
||||||
int m_nbackends; /**< Number of backend servers (obsolete) */
|
int m_nbackends; /**< Number of backend servers (obsolete) */
|
||||||
DCB* m_client; /**< The client DCB */
|
DCB* m_client; /**< The client DCB */
|
||||||
uint64_t m_sescmd_count; /**< Number of executed session commands */
|
uint64_t m_sescmd_count; /**< Number of executed session commands (starts from 1) */
|
||||||
int m_expected_responses; /**< Number of expected responses to the current
|
int m_expected_responses; /**< Number of expected responses to the current
|
||||||
* query */
|
* query */
|
||||||
GWBUF* m_query_queue; /**< Queued commands waiting to be executed */
|
GWBUF* m_query_queue; /**< Queued commands waiting to be executed */
|
||||||
|
|||||||
Reference in New Issue
Block a user