Commit dab56d5e authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

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.
parent b8b1aef6
......@@ -2188,3 +2188,8 @@ sleep(50)
connection extracon;
sleep(5.5)
0
connect comp_con,localhost,root,,,,,COMPRESS;
SELECT 1;
1
1
disconnect comp_con;
......@@ -92,3 +92,9 @@ connection con2;
connection extracon;
--reap
# Check if compression works OK
connect (comp_con,localhost,root,,,,,COMPRESS);
SELECT 1;
disconnect comp_con;
......@@ -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");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment