Store PS session commands with internal ID
Commit a9e236497963251f8b4afa07484b88ad97e73a03 changed where the PS ID for a binary protocol command is replaced with the internal form. This caused prepared statements that are also session commands to be always routed with the external ID. As the external ID is almost always the master's ID, the aforementioned bug resulted in odd side-effects and the true cause of these was only revealed when the error message sent by the slave was included in the log messages.
This commit is contained in:
parent
7e54cb8132
commit
b443bb7525
@ -400,6 +400,17 @@ void RWSplitSession::continue_large_session_write(GWBUF* querybuf, uint32_t type
|
||||
*/
|
||||
bool RWSplitSession::route_session_write(GWBUF* querybuf, uint8_t command, uint32_t type)
|
||||
{
|
||||
if (mxs_mysql_is_ps_command(m_qc.current_route_info().command()))
|
||||
{
|
||||
/**
|
||||
* Replace the ID with our internal one, the backends will replace it with their own ID
|
||||
* when the packet is being written. We use the internal ID when we store the command
|
||||
* to remove the need for extra conversions from external to internal form when the command
|
||||
* is being replayed on a server.
|
||||
*/
|
||||
replace_binary_ps_id(querybuf, m_qc.current_route_info().stmt_id());
|
||||
}
|
||||
|
||||
/** The SessionCommand takes ownership of the buffer */
|
||||
uint64_t id = m_sescmd_count++;
|
||||
mxs::SSessionCommand sescmd(new mxs::SessionCommand(querybuf, id));
|
||||
|
Loading…
x
Reference in New Issue
Block a user