[MDEV-3193] LP:909537 - Thread pool doesn't recognize threads waiting on row or metadata locks as idle Created: 2011-12-29  Updated: 2014-06-20  Resolved: 2012-10-04

Status: Closed
Project: MariaDB Server
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug
Reporter: Elena Stepanova Assignee: Vladislav Vaintroub
Resolution: Fixed Votes: 0
Labels: Launchpad

Attachments: XML File LPexportBug909537.xml    

 Description   

Thread pool does not switch threads which are stuck waiting for a row lock or table metadata lock to 'idle' (or waiting). Consequently, it counts them as active while making a decision whether to create a new one.

bzr version-info
revision-id: <email address hidden>
date: 2011-12-28 03:51:12 +0100
build-date: 2011-12-29 02:46:37 +0200
revno: 3182
branch-nick: lp-5.5-threadpool

  1. Test case 1 (for row locks):

--source include/have_innodb.inc

SET GLOBAL thread_pool_idle_timeout=1;
SET GLOBAL thread_pool_stall_limit=60;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

  1. number of connections
    --let $count=8

--let $id=$count
while ($id)
{
--connect(con$id,localhost,root,,)
--dec $id
}

--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 ( i INT PRIMARY KEY ) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1),(2);

FLUSH STATUS;
BEGIN;
UPDATE t1 SET i=3 WHERE i=1;

--let $id=$count

while ($id)
{
--connection con$id
--send UPDATE t1 SET i=4 WHERE i=1
--dec $id
}

--connection default

  1. long sleeps are ugly, but they're here to rule out side-effects
  2. of some other timing problems that I observe.
  3. The production test case should be smarter
    --sleep 4
    SHOW GLOBAL STATUS LIKE 'threadpool_%threads';
    --sleep 4
    SHOW GLOBAL STATUS LIKE 'threadpool_%threads';

SHOW PROCESSLIST;
--query_vertical SHOW ENGINE INNODB STATUS

--exit

  1. End of test case 1

Here the first SHOW GLOBAL STATUS returns
Threadpool_idle_threads 3
Threadpool_threads 11

and the second one still
Threadpool_idle_threads 3
Threadpool_threads 11

InnoDB status shows that the transactions are indeed inside InnoDB.



 Comments   
Comment by Elena Stepanova [ 2011-12-29 ]

Re: Thread pool doesn't recognize threads waiting on row or metadata locks as idle

  1. Test case 2 (metadata locks)

--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 ( i INT );
LOCK TABLE t1 WRITE;

--let $count=8

--let $id=$count
while ($id)
{
--connect(con$id,localhost,root,,)
--dec $id
}

--let $id=$count
while ($id)
{
--connection con$id
--send SELECT 1 FROM t1
--dec $id
}

--connection default
--sleep 4
SHOW GLOBAL STATUS LIKE 'threadpool_%threads';
--sleep 4
SHOW GLOBAL STATUS LIKE 'threadpool_%threads';
SHOW PROCESSLIST;

DROP TABLE t1;

--exit

  1. End of test case 2

Same output as in the 1st test case – both times

Threadpool_idle_threads 3
Threadpool_threads 12

Process list shows that all threads are "Waiting for table metadata lock".

Comment by Elena Stepanova [ 2012-03-18 ]

Re: Thread pool doesn't recognize threads waiting on row or metadata locks as idle
Fix released with 5.5.21.

Comment by Rasmus Johansson (Inactive) [ 2012-03-18 ]

Launchpad bug id: 909537

Generated at Thu Feb 08 06:46:57 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.