MXS-3106: Always write the final COM_QUIT

This seems to help with a regression that was introduced in 2.4.11.
This commit is contained in:
Markus Mäkelä
2020-08-21 08:27:34 +03:00
parent b90d42b999
commit c5b47389df
5 changed files with 11 additions and 15 deletions

View File

@ -822,7 +822,7 @@ static int dcb_log_errors_SSL(DCB* dcb, int ret)
unsigned long ssl_errno;
ssl_errno = ERR_get_error();
if (0 == ssl_errno)
if (0 == ssl_errno || dcb->silence_write_errors)
{
return 0;
}
@ -1806,7 +1806,8 @@ static int gw_write(DCB* dcb, GWBUF* writeq, bool* stop_writing)
if (written < 0)
{
*stop_writing = true;
if (saved_errno != EAGAIN && saved_errno != EWOULDBLOCK && saved_errno != EPIPE)
if (saved_errno != EAGAIN && saved_errno != EWOULDBLOCK && saved_errno != EPIPE
&& !dcb->silence_write_errors)
{
MXS_ERROR("Write to %s %s in state %s failed: %d, %s",
dcb->type(),

View File

@ -1291,12 +1291,6 @@ 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 */
@ -1409,11 +1403,9 @@ static int gw_backend_close(DCB* dcb)
mxb_assert(dcb->session || dcb->persistentstart);
MySQLProtocol* proto = (MySQLProtocol*)dcb->protocol;
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));
}
// Always send a COM_QUIT to the backend being closed. This causes the connection to be closed faster.
dcb->silence_write_errors = true;
dcb_write(dcb, mysql_create_com_quit(NULL, 0));
/** Free protocol data */
mysql_protocol_done(dcb);

View File

@ -64,7 +64,6 @@ 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;