MXS-3055: Prevent sending of an extra COM_QUIT
If the protocol routes a COM_QUIT packet to the backend, it must not generate a packet when it is shutting down. This could cause unexpected write errors if the backend server managed to close the socket before the write was done.
This commit is contained in:
@ -1286,6 +1286,12 @@ static int gw_MySQLWrite_backend(DCB* dcb, GWBUF* queue)
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (cmd == MXS_COM_QUIT)
|
||||
{
|
||||
backend_protocol->send_com_quit = false;
|
||||
}
|
||||
|
||||
if (GWBUF_IS_IGNORABLE(queue))
|
||||
{
|
||||
/** The response to this command should be ignored */
|
||||
@ -1398,8 +1404,11 @@ static int gw_backend_close(DCB* dcb)
|
||||
mxb_assert(dcb->session || dcb->persistentstart);
|
||||
MySQLProtocol* proto = (MySQLProtocol*)dcb->protocol;
|
||||
|
||||
/** Send COM_QUIT to the backend being closed */
|
||||
dcb_write(dcb, mysql_create_com_quit(NULL, 0));
|
||||
if (proto->send_com_quit && proto->protocol_auth_state == MXS_AUTH_STATE_COMPLETE)
|
||||
{
|
||||
// Send a COM_QUIT to the backend being closed, we haven't routed one to it yet.
|
||||
dcb_write(dcb, mysql_create_com_quit(NULL, 0));
|
||||
}
|
||||
|
||||
/** Free protocol data */
|
||||
mysql_protocol_done(dcb);
|
||||
|
@ -64,6 +64,7 @@ MySQLProtocol* mysql_protocol_init(DCB* dcb, int fd)
|
||||
p->num_eof_packets = 0;
|
||||
p->large_query = false;
|
||||
p->track_state = false;
|
||||
p->send_com_quit = true;
|
||||
/*< Assign fd with protocol */
|
||||
p->fd = fd;
|
||||
p->owner_dcb = dcb;
|
||||
|
Reference in New Issue
Block a user