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

Bug #909537 reported by Elena Stepanova
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
MariaDB
Fix Released
Undecided
Vladislav Vaintroub

Bug 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

# 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;

# 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
# long sleeps are ugly, but they're here to rule out side-effects
# of some other timing problems that I observe.
# 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

# 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.

Related branches

Revision history for this message
Elena Stepanova (elenst) wrote :

# 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

# 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".

Changed in maria:
status: New → Fix Committed
Revision history for this message
Elena Stepanova (elenst) wrote :

Fix released with 5.5.21.

Changed in maria:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.