Skip to content
Permalink
Browse files
MDEV-23879 server hangs with threadpool, compression, and client pipe…
…lining

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.
  • Loading branch information
vaintroub committed Oct 2, 2020
1 parent b8b1aef commit dab56d5
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 3 deletions.
@@ -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");

0 comments on commit dab56d5

Please sign in to comment.