From: Jon Olav Hauglid Date: March 29 2011 8:09am Subject: bzr commit into mysql-5.1 branch (jon.hauglid:3641) Bug#11763784 List-Archive: http://lists.mysql.com/commits/134121 X-Bug: 11763784 Message-Id: <201103290809.p2T89a12004107@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1600111680951695804==" --===============1600111680951695804== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-5.1-bug11763784/ based on revid:mayank.prasad@stripped 3641 Jon Olav Hauglid 2011-03-29 Bug# 11763784 (former 56541) ASSERTION TABLE->DB_STAT FAILED IN SQL_BASE.CC::OPEN_TABLE() DURING I_S Q This assert could be triggered if a statement requiring a name lock on a table (e.g. DROP TRIGGER) executed concurrently with an I_S query which also used the table. One connection first started an I_S query that opened a given table. Then another connection started a statement requiring a name lock on the same table. This statement was blocked since the table was in use by the I_S query. When the I_S query resumed and tried to open the table again as part of get_all_tables(), it would encounter a table instance with an old version number representing the pending name lock. Since I_S queries ignore version checks and thus pending name locks, it would try to continue. This caused it to encounter the assert. The assert checked that the TABLE instance found with a different version, was a real, open table. However, since this TABLE instance instead represented a pending name lock, the check would fail and trigger the assert. This patch fixes the problem by removing the assert. It is ok for TABLE::db_stat to be 0 in this case since the TABLE instance can represent a pending name lock. Test case added to lock_sync.test. modified: mysql-test/r/lock_sync.result mysql-test/t/lock_sync.test sql/sql_base.cc === modified file 'mysql-test/r/lock_sync.result' --- a/mysql-test/r/lock_sync.result 2010-05-27 20:07:40 +0000 +++ b/mysql-test/r/lock_sync.result 2011-03-29 08:09:05 +0000 @@ -629,3 +629,30 @@ drop procedure p1; drop procedure p2; drop table t1, t2, t3, t4, t5, te; set @@global.concurrent_insert= @old_concurrent_insert; +# +# Bug#11763784 56541: ASSERTION TABLE->DB_STAT FAILED IN +# SQL_BASE.CC::OPEN_TABLE() DURING I_S Q +# +DROP TABLE IF EXISTS t1; +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (1), (2); +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW BEGIN END; +# Connection con2 +SET DEBUG_SYNC= 'before_open_in_get_all_tables SIGNAL is_waits WAIT_FOR is_cont'; +# Sending: +SELECT * FROM information_schema.table_constraints JOIN t1 ON table_name = a; +# Connection con1 +SET DEBUG_SYNC= 'now WAIT_FOR is_waits'; +# Sending: +DROP TRIGGER t1_bi; +# Connection default +# Wait until DROP TRIGGER is blocked, waiting for t1 +SET DEBUG_SYNC= 'now SIGNAL is_cont'; +# Connection con2 +# Reaping SELECT * FROM information_schema.table_constraints JOIN t1... +CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE a +# Connection con1 +# Reaping DROP TRIGGER t1_bi +# Connection default +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; === modified file 'mysql-test/t/lock_sync.test' --- a/mysql-test/t/lock_sync.test 2010-05-27 20:07:40 +0000 +++ b/mysql-test/t/lock_sync.test 2011-03-29 08:09:05 +0000 @@ -862,6 +862,60 @@ disconnect con2; set @@global.concurrent_insert= @old_concurrent_insert; +--echo # +--echo # Bug#11763784 56541: ASSERTION TABLE->DB_STAT FAILED IN +--echo # SQL_BASE.CC::OPEN_TABLE() DURING I_S Q +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES (1), (2); +CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW BEGIN END; + +connect (con1, localhost, root); +--echo # Connection con2 +connect (con2, localhost, root); +SET DEBUG_SYNC= 'before_open_in_get_all_tables SIGNAL is_waits WAIT_FOR is_cont'; +--echo # Sending: +--send SELECT * FROM information_schema.table_constraints JOIN t1 ON table_name = a + +--echo # Connection con1 +connection con1; +SET DEBUG_SYNC= 'now WAIT_FOR is_waits'; +--echo # Sending: +--send DROP TRIGGER t1_bi + +--echo # Connection default +connection default; +--echo # Wait until DROP TRIGGER is blocked, waiting for t1 +let $wait_condition= + SELECT COUNT(*) = 1 FROM information_schema.processlist + WHERE state = "Waiting for table" AND + info = "DROP TRIGGER t1_bi"; +--source include/wait_condition.inc +SET DEBUG_SYNC= 'now SIGNAL is_cont'; + +--echo # Connection con2 +connection con2; +--echo # Reaping SELECT * FROM information_schema.table_constraints JOIN t1... +--reap + +--echo # Connection con1 +connection con1; +--echo # Reaping DROP TRIGGER t1_bi +--reap + +--echo # Connection default +connection default; +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; +disconnect con1; +disconnect con2; + + # Check that all connections opened by test cases in this file are really # gone so execution of other tests won't be affected by their presence. --source include/wait_until_count_sessions.inc === modified file 'sql/sql_base.cc' --- a/sql/sql_base.cc 2011-01-25 14:42:40 +0000 +++ b/sql/sql_base.cc 2011-03-29 08:09:05 +0000 @@ -2798,10 +2798,9 @@ TABLE *open_table(THD *thd, TABLE_LIST * ("Found table '%s.%s' with different refresh version", table_list->db, table_list->table_name)); - /* Ignore FLUSH, but not name locks! */ + /* Ignore FLUSH and pending name locks, but not acquired name locks! */ if (flags & MYSQL_LOCK_IGNORE_FLUSH && !table->open_placeholder) { - DBUG_ASSERT(table->db_stat); /* Force close at once after usage */ thd->version= table->s->version; continue; --===============1600111680951695804== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-5.1-bug11763784/ # testament_sha1: d633f041bd094dab8288c6487b790190b4846f06 # timestamp: 2011-03-29 10:09:24 +0200 # base_revision_id: mayank.prasad@stripped\ # 3zv234xlcqq5js5o # # Begin bundle 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 --===============1600111680951695804==--