From: Mattias Jonsson Date: August 17 2010 4:07pm Subject: bzr commit into mysql-5.5-bugfixing branch (mattias.jonsson:3184) List-Archive: http://lists.mysql.com/commits/115993 Message-Id: <201008171609.o7H25vMU021604@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4965958093449145221==" --===============4965958093449145221== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mattiasj/mysql-bzr/b54747-5.5-bf/ based on revid:joerg@stripped 3184 Mattias Jonsson 2010-08-17 [merge] merge modified: mysql-test/r/partition_debug_sync.result mysql-test/t/partition_debug_sync.test sql/sql_base.cc sql/sql_partition.cc sql/sql_table.cc === modified file 'mysql-test/r/partition_debug_sync.result' --- a/mysql-test/r/partition_debug_sync.result 2010-07-01 13:53:46 +0000 +++ b/mysql-test/r/partition_debug_sync.result 2010-08-17 15:54:04 +0000 @@ -1,6 +1,38 @@ DROP TABLE IF EXISTS t1, t2; SET DEBUG_SYNC= 'RESET'; # +# Bug#54747: Deadlock between REORGANIZE PARTITION and +# SELECT is not detected +# +SET GLOBAL innodb_thread_concurrency = 1; +CREATE TABLE t1 +(user_num BIGINT, +hours SMALLINT, +KEY user_num (user_num)) +ENGINE = InnoDB +PARTITION BY RANGE COLUMNS (hours) +(PARTITION hour_003 VALUES LESS THAN (3), +PARTITION hour_004 VALUES LESS THAN (4), +PARTITION hour_005 VALUES LESS THAN (5), +PARTITION hour_last VALUES LESS THAN (MAXVALUE)); +LOAD DATA LOCAL INFILE '/Users/mattiasj/mysql-bzr/test-55-bugfixing/b/mysql-test/var/t_part_range.load' +INTO TABLE t1 (user_num, hours); +# Start a ALTER PARTITION and wait between the copy and rename of table. +# con1 +SET DEBUG_SYNC= 'wait_while_table_is_used SIGNAL run_select WAIT_FOR select_started'; +ALTER TABLE t1 +REORGANIZE PARTITION hour_003, hour_004 INTO +(PARTITION oldest VALUES LESS THAN (4)); +# Start a concurrent SELECT +SET DEBUG_SYNC= 'now WAIT_FOR run_select'; +SET DEBUG_SYNC= 'after_lock_tables_takes_lock SIGNAL select_started'; +SELECT COUNT(*) FROM t1; +COUNT(*) +10000 +SET DEBUG_SYNC= 'RESET'; +SET GLOBAL innodb_thread_concurrency = 0; +DROP TABLE t1; +# # Bug#42438: Crash ha_partition::change_table_ptr # Test when remove partitioning is done while drop table is waiting # for the table. === modified file 'mysql-test/t/partition_debug_sync.test' --- a/mysql-test/t/partition_debug_sync.test 2010-07-01 13:53:46 +0000 +++ b/mysql-test/t/partition_debug_sync.test 2010-08-17 15:54:04 +0000 @@ -12,6 +12,68 @@ SET DEBUG_SYNC= 'RESET'; --enable_warnings --echo # +--echo # Bug#54747: Deadlock between REORGANIZE PARTITION and +--echo # SELECT is not detected +--echo # + +let $thread_concurrency = `SELECT @@innodb_thread_concurrency`; +SET GLOBAL innodb_thread_concurrency = 1; + +CREATE TABLE t1 +(user_num BIGINT, + hours SMALLINT, + KEY user_num (user_num)) +ENGINE = InnoDB +PARTITION BY RANGE COLUMNS (hours) +(PARTITION hour_003 VALUES LESS THAN (3), + PARTITION hour_004 VALUES LESS THAN (4), + PARTITION hour_005 VALUES LESS THAN (5), + PARTITION hour_last VALUES LESS THAN (MAXVALUE)); + +--perl +open( DATA, ">$ENV{MYSQLTEST_VARDIR}/t_part_range.load" ) + || die "Could not open file $ENV{MYSQLTEST_VARDIR}/t_part_range.load for writing: $!"; +for ( 1..10000 ) +{ + print DATA ( int(rand(9000000000))+1000000000 ), "\t", ( int(rand(5)) ), "\n"; +} +close( DATA ); +EOF + +eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/t_part_range.load' + INTO TABLE t1 (user_num, hours); + + +--echo # Start a ALTER PARTITION and wait between the copy and rename of table. +--echo # con1 + +--connect (con1,localhost,root,,) +SET DEBUG_SYNC= 'wait_while_table_is_used SIGNAL run_select WAIT_FOR select_started'; +--send +ALTER TABLE t1 +REORGANIZE PARTITION hour_003, hour_004 INTO +(PARTITION oldest VALUES LESS THAN (4)); + +--echo # Start a concurrent SELECT + +--connection default +#START TRANSACTION; +SET DEBUG_SYNC= 'now WAIT_FOR run_select'; +SET DEBUG_SYNC= 'after_lock_tables_takes_lock SIGNAL select_started'; +SELECT COUNT(*) FROM t1; + +--connection con1 +--reap + +--disconnect con1 + +--connection default + +SET DEBUG_SYNC= 'RESET'; +eval SET GLOBAL innodb_thread_concurrency = $thread_concurrency; +DROP TABLE t1; + +--echo # --echo # Bug#42438: Crash ha_partition::change_table_ptr --echo # Test when remove partitioning is done while drop table is waiting --echo # for the table. === modified file 'sql/sql_base.cc' --- a/sql/sql_base.cc 2010-08-13 07:50:25 +0000 +++ b/sql/sql_base.cc 2010-08-17 15:54:04 +0000 @@ -2197,6 +2197,8 @@ bool wait_while_table_is_used(THD *thd, table->s->table_name.str, (ulong) table->s, table->db_stat, table->s->version)); + DEBUG_SYNC(thd, "wait_while_table_is_used"); + if (thd->mdl_context.upgrade_shared_lock_to_exclusive( table->mdl_ticket, thd->variables.lock_wait_timeout)) DBUG_RETURN(TRUE); === modified file 'sql/sql_partition.cc' --- a/sql/sql_partition.cc 2010-08-13 07:50:25 +0000 +++ b/sql/sql_partition.cc 2010-08-17 15:54:04 +0000 @@ -4377,7 +4377,6 @@ static int fast_end_partition(THD *thd, ALTER_PARTITION_PARAM_TYPE *lpt, bool written_bin_log) { - int error; char tmp_name[80]; DBUG_ENTER("fast_end_partition"); @@ -4386,13 +4385,6 @@ static int fast_end_partition(THD *thd, if (!is_empty) query_cache_invalidate3(thd, table_list, 0); - error= trans_commit_stmt(thd); - if (trans_commit_implicit(thd)) - error= 1; - - if (error) - DBUG_RETURN(TRUE); /* The error has been reported */ - if ((!is_empty) && (!written_bin_log) && (!thd->lex->no_write_to_binlog) && write_bin_log(thd, FALSE, thd->query(), thd->query_length())) @@ -5535,9 +5527,20 @@ static bool mysql_change_partitions(ALTE char path[FN_REFLEN+1]; int error; handler *file= lpt->table->file; + THD *thd= lpt->thd; DBUG_ENTER("mysql_change_partitions"); build_table_filename(path, sizeof(path) - 1, lpt->db, lpt->table_name, "", 0); + + /* + Turn off recovery logging since rollback of an alter table is to + delete the new table so there is no need to log the changes to it. + + This needs to be done before external_lock. + */ + if(ha_enable_transaction(thd, FALSE)) + DBUG_RETURN(TRUE); + if ((error= file->ha_change_partitions(lpt->create_info, path, &lpt->copied, &lpt->deleted, lpt->pack_frm_data, lpt->pack_frm_len))) @@ -5545,6 +5548,21 @@ static bool mysql_change_partitions(ALTE file->print_error(error, MYF(error != ER_OUTOFMEMORY ? 0 : ME_FATALERROR)); DBUG_RETURN(TRUE); } + + if (ha_enable_transaction(thd, TRUE)) + DBUG_RETURN(TRUE); + + /* + Ensure that the new table is saved properly to disk + before installing new .FRM and releasing InnoDB's internal latches. + */ + error= trans_commit_stmt(thd); + if (trans_commit_implicit(thd)) + error= 1; + + if (error) + DBUG_RETURN(TRUE); /* The error has been reported */ + DBUG_RETURN(FALSE); } === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2010-08-16 12:58:38 +0000 +++ b/sql/sql_table.cc 2010-08-17 15:54:04 +0000 @@ -6902,7 +6902,9 @@ copy_data_between_tables(TABLE *from,TAB /* Ensure that the new table is saved properly to disk so that we - can do a rename + can do a rename. + And release InnoDB's internal latches, to avoid deadlock + when waiting on other tables before rename. */ if (trans_commit_stmt(thd)) error=1; --===============4965958093449145221== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/mattias.jonsson@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: mattias.jonsson@stripped\ # pjrpk8i5m8ux4x40 # target_branch: file:///Users/mattiasj/mysql-bzr/b54747-5.5-bf/ # testament_sha1: aaf2e754e1a90d0989ce8d9a2c57f4c2ac8ce51e # timestamp: 2010-08-17 18:07:41 +0200 # source_branch: file:///Users/mattiasj/mysql-bzr/test-55-bugfixing/ # base_revision_id: joerg@stripped # # Begin bundle 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 --===============4965958093449145221==--