From: Christopher Powers Date: August 23 2010 1:42am Subject: bzr commit into mysql-5.5-bugfixing branch (chris.powers:3191) List-Archive: http://lists.mysql.com/commits/116459 Message-Id: <20100823014236.9BDB61DB0318@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4822877308631216286==" --===============4822877308631216286== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/cpowers/work/dev/dev-55-bugfixing/mysql/ based on revid:chris.powers@stripped 3191 Christopher Powers 2010-08-22 [merge] merge modified: mysql-test/r/partition_innodb.result mysql-test/t/partition_innodb.test sql/sql_partition.cc sql/sql_table.cc sql/sql_table.h === modified file 'mysql-test/r/partition_innodb.result' --- a/mysql-test/r/partition_innodb.result 2010-08-13 07:50:25 +0000 +++ b/mysql-test/r/partition_innodb.result 2010-08-20 17:15:48 +0000 @@ -1,5 +1,41 @@ drop table if exists t1, t2; # +# Bug#54747: Deadlock between REORGANIZE PARTITION and +# SELECT is not detected +# +SET @old_innodb_thread_concurrency:= @@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)); +INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3), (4, 4), (5, 5); +BEGIN; +SELECT COUNT(*) FROM t1; +COUNT(*) +5 +# con1 +# SEND a ALTER PARTITION which waits on the ongoing transaction. +ALTER TABLE t1 +REORGANIZE PARTITION hour_003, hour_004 INTO +(PARTITION oldest VALUES LESS THAN (4)); +# Connection default wait until the ALTER is in 'waiting for table...' +# state and then continue the transaction by trying a SELECT +SELECT COUNT(*) FROM t1; +COUNT(*) +5 +COMMIT; +# con1, reaping ALTER. +# Disconnecting con1 and switching to default. Cleaning up. +SET GLOBAL innodb_thread_concurrency = @old_innodb_thread_concurrency; +DROP TABLE t1; +# # Bug#50418: DROP PARTITION does not interact with transactions # CREATE TABLE t1 ( === modified file 'mysql-test/t/partition_innodb.test' --- a/mysql-test/t/partition_innodb.test 2010-08-13 07:50:25 +0000 +++ b/mysql-test/t/partition_innodb.test 2010-08-20 17:15:48 +0000 @@ -9,6 +9,63 @@ drop table if exists t1, t2; let $MYSQLD_DATADIR= `SELECT @@datadir`; --echo # +--echo # Bug#54747: Deadlock between REORGANIZE PARTITION and +--echo # SELECT is not detected +--echo # + +SET @old_innodb_thread_concurrency:= @@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)); + +INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3), (4, 4), (5, 5); + +BEGIN; +SELECT COUNT(*) FROM t1; + +--echo # con1 +--connect (con1,localhost,root,,) +--echo # SEND a ALTER PARTITION which waits on the ongoing transaction. +--send +ALTER TABLE t1 +REORGANIZE PARTITION hour_003, hour_004 INTO +(PARTITION oldest VALUES LESS THAN (4)); + +--echo # Connection default wait until the ALTER is in 'waiting for table...' +--echo # state and then continue the transaction by trying a SELECT +--connection default +let $wait_condition = +SELECT COUNT(*) = 1 +FROM information_schema.processlist +WHERE INFO like 'ALTER TABLE t1%REORGANIZE PARTITION hour_003, hour_004%' +AND STATE = 'Waiting for table metadata lock'; +--source include/wait_condition.inc +SELECT COUNT(*) FROM t1; +COMMIT; + +--echo # con1, reaping ALTER. +--connection con1 +--reap + +--echo # Disconnecting con1 and switching to default. Cleaning up. +--disconnect con1 + +--connection default + +SET GLOBAL innodb_thread_concurrency = @old_innodb_thread_concurrency; +DROP TABLE t1; + + +--echo # --echo # Bug#50418: DROP PARTITION does not interact with transactions --echo # CREATE TABLE t1 ( === modified file 'sql/sql_partition.cc' --- a/sql/sql_partition.cc 2010-08-18 11:29:04 +0000 +++ b/sql/sql_partition.cc 2010-08-20 17:15:48 +0000 @@ -63,6 +63,7 @@ #include "sql_table.h" // build_table_filename, // build_table_shadow_filename, // table_to_filename + // mysql_*_alter_copy_data #include "opt_range.h" // store_key_image_to_rec #include "sql_analyse.h" // append_escaped @@ -4377,7 +4378,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 +4386,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,17 +5528,25 @@ 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); + + if(mysql_trans_prepare_alter_copy_data(thd)) + 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))) { file->print_error(error, MYF(error != ER_OUTOFMEMORY ? 0 : ME_FATALERROR)); - DBUG_RETURN(TRUE); } - DBUG_RETURN(FALSE); + + if (mysql_trans_commit_alter_copy_data(thd)) + DBUG_RETURN(TRUE); /* The error has been reported */ + + DBUG_RETURN(test(error)); } === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2010-08-20 08:24:32 +0000 +++ b/sql/sql_table.cc 2010-08-20 17:15:48 +0000 @@ -6740,6 +6740,54 @@ err_with_mdl: } /* mysql_alter_table */ + + +/** + Prepare the transaction for the alter table's copy phase. +*/ + +bool mysql_trans_prepare_alter_copy_data(THD *thd) +{ + DBUG_ENTER("mysql_prepare_alter_copy_data"); + /* + 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); + DBUG_RETURN(FALSE); +} + + +/** + Commit the copy phase of the alter table. +*/ + +bool mysql_trans_commit_alter_copy_data(THD *thd) +{ + bool error= FALSE; + DBUG_ENTER("mysql_commit_alter_copy_data"); + + if (ha_enable_transaction(thd, TRUE)) + DBUG_RETURN(TRUE); + + /* + Ensure that the new table is saved properly to disk before installing + the new .frm. + And that InnoDB's internal latches are released, to avoid deadlock + when waiting on other instances of the table before rename (Bug#54747). + */ + if (trans_commit_stmt(thd)) + error= TRUE; + if (trans_commit_implicit(thd)) + error= TRUE; + + DBUG_RETURN(error); +} + + static int copy_data_between_tables(TABLE *from,TABLE *to, List &create, @@ -6766,14 +6814,7 @@ copy_data_between_tables(TABLE *from,TAB ulonglong prev_insert_id; DBUG_ENTER("copy_data_between_tables"); - /* - 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 - */ - error= ha_enable_transaction(thd, FALSE); - if (error) + if (mysql_trans_prepare_alter_copy_data(thd)) DBUG_RETURN(-1); if (!(copy= new Copy_field[to->s->fields])) @@ -6932,20 +6973,8 @@ copy_data_between_tables(TABLE *from,TAB } to->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); - if (ha_enable_transaction(thd, TRUE)) - { + if (mysql_trans_commit_alter_copy_data(thd)) error= 1; - goto err; - } - - /* - Ensure that the new table is saved properly to disk so that we - can do a rename - */ - if (trans_commit_stmt(thd)) - error=1; - if (trans_commit_implicit(thd)) - error=1; err: thd->variables.sql_mode= save_sql_mode; === modified file 'sql/sql_table.h' --- a/sql/sql_table.h 2010-08-20 02:59:58 +0000 +++ b/sql/sql_table.h 2010-08-20 17:15:48 +0000 @@ -143,6 +143,8 @@ bool mysql_create_table_no_lock(THD *thd bool mysql_prepare_alter_table(THD *thd, TABLE *table, HA_CREATE_INFO *create_info, Alter_info *alter_info); +bool mysql_trans_prepare_alter_copy_data(THD *thd); +bool mysql_trans_commit_alter_copy_data(THD *thd); bool mysql_alter_table(THD *thd, char *new_db, char *new_name, HA_CREATE_INFO *create_info, TABLE_LIST *table_list, --===============4822877308631216286== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/chris.powers@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: chris.powers@stripped # target_branch: file:///home/cpowers/work/dev/dev-55-bugfixing/mysql/ # testament_sha1: 47d0f523be814fc0d6ae7818425002a2cfb93a33 # timestamp: 2010-08-22 20:42:36 -0500 # base_revision_id: chris.powers@stripped\ # n9xvppjn7nl2x3aw # # Begin bundle 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 DOB/i7kinChIBoNqiQA= --===============4822877308631216286==--