1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-23879 server hangs with threadpool, compression, and client pipelining

Amend check for unread client data in threadpool.

THD::NET will have unread data, in case client uses compression, and
wraps multiple commands into  a single compression packet

MariaDB C/C sends COM_STMT_RESET+COM_STMT_EXECUTE, and wraps it into
a single compressed packet, when compression is on, thus trying to use
compression and prepared statements against a threadpool-enabled server
will result into a hang, before this patch.
This commit is contained in:
Vladislav Vaintroub
2020-10-03 00:24:53 +02:00
parent b8b1aef6b1
commit dab56d5e8e
3 changed files with 22 additions and 3 deletions

View File

@ -324,6 +324,16 @@ static void handle_wait_timeout(THD *thd)
thd->net.error= 2;
}
/** Check if some client data is cached in thd->net or thd->net.vio */
static bool has_unread_data(THD* thd)
{
NET *net= &thd->net;
if (net->compress && net->remain_in_buf)
return true;
Vio *vio= net->vio;
return vio->has_data(vio);
}
/**
Process a single client request or a single batch.
@ -358,7 +368,6 @@ static int threadpool_process_request(THD *thd)
*/
for(;;)
{
Vio *vio;
thd->net.reading_or_writing= 0;
if (mysql_audit_release_required(thd))
mysql_audit_release(thd);
@ -374,8 +383,7 @@ static int threadpool_process_request(THD *thd)
set_thd_idle(thd);
vio= thd->net.vio;
if (!vio->has_data(vio))
if (!has_unread_data(thd))
{
/* More info on this debug sync is in sql_parse.cc*/
DEBUG_SYNC(thd, "before_do_command_net_read");