Fix COM_CHANGE_USER unknown response handling
The response handling logic did not always take the last packet for inspection when a COM_CHANGE_USER was executed. The OK packet will always be the last one since the COM_CHANGE_USER is the last command that was sent.
This commit is contained in:
@ -748,24 +748,16 @@ gw_read_and_write(DCB *dcb)
|
|||||||
proto->stored_query = NULL;
|
proto->stored_query = NULL;
|
||||||
proto->ignore_reply = false;
|
proto->ignore_reply = false;
|
||||||
GWBUF* reply = modutil_get_next_MySQL_packet(&read_buffer);
|
GWBUF* reply = modutil_get_next_MySQL_packet(&read_buffer);
|
||||||
ss_dassert(reply);
|
|
||||||
ss_dassert(read_buffer == NULL);
|
|
||||||
int n_unknown = 0;
|
|
||||||
|
|
||||||
while (reply && not_ok_packet(reply) && not_err_packet(reply))
|
while (read_buffer)
|
||||||
{
|
{
|
||||||
|
/** Skip to the last packet if we get more than one */
|
||||||
gwbuf_free(reply);
|
gwbuf_free(reply);
|
||||||
reply = modutil_get_next_MySQL_packet(&read_buffer);
|
reply = modutil_get_next_MySQL_packet(&read_buffer);
|
||||||
n_unknown++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reply == NULL)
|
|
||||||
{
|
|
||||||
ss_dassert(n_unknown > 0);
|
|
||||||
MXS_WARNING("Ignored %d unknown responses to COM_CHANGE_USER but no OK packet was found.", n_unknown);
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ss_dassert(reply);
|
||||||
|
ss_dassert(!read_buffer);
|
||||||
uint8_t result = MYSQL_GET_COMMAND(GWBUF_DATA(reply));
|
uint8_t result = MYSQL_GET_COMMAND(GWBUF_DATA(reply));
|
||||||
int rval = 0;
|
int rval = 0;
|
||||||
|
|
||||||
@ -785,8 +777,12 @@ gw_read_and_write(DCB *dcb)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/** This should never happen */
|
/** This should never happen */
|
||||||
MXS_ERROR("Unknown response to COM_CHANGE_USER: 0x%02hhx", result);
|
MXS_ERROR("Unknown response to COM_CHANGE_USER (0x%02hhx), "
|
||||||
ss_dassert(false);
|
"ignoring and waiting for correct result", result);
|
||||||
|
gwbuf_free(reply);
|
||||||
|
proto->stored_query = query;
|
||||||
|
proto->ignore_reply = true;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
gwbuf_free(query);
|
gwbuf_free(query);
|
||||||
poll_fake_hangup_event(dcb);
|
poll_fake_hangup_event(dcb);
|
||||||
|
Reference in New Issue
Block a user