mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +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:
@ -2188,3 +2188,8 @@ sleep(50)
|
|||||||
connection extracon;
|
connection extracon;
|
||||||
sleep(5.5)
|
sleep(5.5)
|
||||||
0
|
0
|
||||||
|
connect comp_con,localhost,root,,,,,COMPRESS;
|
||||||
|
SELECT 1;
|
||||||
|
1
|
||||||
|
1
|
||||||
|
disconnect comp_con;
|
||||||
|
@ -92,3 +92,9 @@ connection con2;
|
|||||||
|
|
||||||
connection extracon;
|
connection extracon;
|
||||||
--reap
|
--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;
|
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.
|
Process a single client request or a single batch.
|
||||||
@ -358,7 +368,6 @@ static int threadpool_process_request(THD *thd)
|
|||||||
*/
|
*/
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
Vio *vio;
|
|
||||||
thd->net.reading_or_writing= 0;
|
thd->net.reading_or_writing= 0;
|
||||||
if (mysql_audit_release_required(thd))
|
if (mysql_audit_release_required(thd))
|
||||||
mysql_audit_release(thd);
|
mysql_audit_release(thd);
|
||||||
@ -374,8 +383,7 @@ static int threadpool_process_request(THD *thd)
|
|||||||
|
|
||||||
set_thd_idle(thd);
|
set_thd_idle(thd);
|
||||||
|
|
||||||
vio= thd->net.vio;
|
if (!has_unread_data(thd))
|
||||||
if (!vio->has_data(vio))
|
|
||||||
{
|
{
|
||||||
/* More info on this debug sync is in sql_parse.cc*/
|
/* More info on this debug sync is in sql_parse.cc*/
|
||||||
DEBUG_SYNC(thd, "before_do_command_net_read");
|
DEBUG_SYNC(thd, "before_do_command_net_read");
|
||||||
|
Reference in New Issue
Block a user