From: Jon Olav Hauglid Date: March 30 2011 1:27pm Subject: bzr commit into mysql-5.5 branch (jon.hauglid:3415) Bug#11853126 List-Archive: http://lists.mysql.com/commits/134259 X-Bug: 11853126 Message-Id: <201103301328.p2UDS1Ok011910@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============9024280395367230113==" --===============9024280395367230113== 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.5-bug11853126/ based on revid:sergey.glukhov@stripped 3415 Jon Olav Hauglid 2011-03-30 Bug#11853126 RE-ENABLE CONCURRENT READS WHILE CREATING SECONDARY INDEX IN INNODB ** This is a draft patch ** Allowing concurrent reads during secondary index creation in InnoDB introduced a regression. This regression occured if ALTER TABLE failed after the index had been added, for example during the lock upgrade needed to update .FRM. This patch tries to fix the problem by dropping the recently added index in such cases and then reopnening the table in order to rebuild the InnoDB index translation table. However, as the test case shows this patch is not a complete solution in it's current state. For discussion purposes only. modified: mysql-test/r/innodb_mysql_lock.result mysql-test/t/innodb_mysql_lock.test sql/sql_table.cc === modified file 'mysql-test/r/innodb_mysql_lock.result' --- a/mysql-test/r/innodb_mysql_lock.result 2010-06-26 20:23:28 +0000 +++ b/mysql-test/r/innodb_mysql_lock.result 2011-03-30 13:27:50 +0000 @@ -148,3 +148,42 @@ COMMIT; # Connection default DROP TABLE t1, t2; DROP VIEW v1; +# +# Bug#11815600 [ERROR] INNODB COULD NOT FIND INDEX PRIMARY +# KEY NO 0 FOR TABLE IN ERROR LOG +# +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (id INT PRIMARY KEY, value INT) ENGINE = InnoDB; +INSERT INTO t1 VALUES (1, 12345); +# Test 1: One timeout. (this works) +# Connection default +START TRANSACTION; +SELECT * FROM t1; +id value +1 12345 +# Connection con1 +SET lock_wait_timeout=1; +ALTER TABLE t1 ADD INDEX idx(value); +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +# Connection default +SELECT * FROM t1; +id value +1 12345 +COMMIT; +# Test 2: Two timeouts. (this doesn't work) +START TRANSACTION; +SELECT * FROM t1; +id value +1 12345 +# Connection con1 +SET lock_wait_timeout=1; +ALTER TABLE t1 ADD INDEX idx(value); +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +ALTER TABLE t1 ADD INDEX idx(value); +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +# Connection default +SELECT * FROM t1; +id value +1 12345 +COMMIT; +DROP TABLE t1; === modified file 'mysql-test/t/innodb_mysql_lock.test' --- a/mysql-test/t/innodb_mysql_lock.test 2010-08-06 11:29:37 +0000 +++ b/mysql-test/t/innodb_mysql_lock.test 2011-03-30 13:27:50 +0000 @@ -279,6 +279,60 @@ disconnect con2; disconnect con3; +--echo # +--echo # Bug#11815600 [ERROR] INNODB COULD NOT FIND INDEX PRIMARY +--echo # KEY NO 0 FOR TABLE IN ERROR LOG +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 (id INT PRIMARY KEY, value INT) ENGINE = InnoDB; +INSERT INTO t1 VALUES (1, 12345); + +--connect (con1,localhost,root) + +--echo # Test 1: One timeout. (this works) + +--echo # Connection default +connection default; +START TRANSACTION; +SELECT * FROM t1; + +--echo # Connection con1 +--connection con1 +SET lock_wait_timeout=1; +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE t1 ADD INDEX idx(value); + +--echo # Connection default +--connection default +SELECT * FROM t1; +COMMIT; + +--echo # Test 2: Two timeouts. (this doesn't work) + +START TRANSACTION; +SELECT * FROM t1; + +--echo # Connection con1 +--connection con1 +SET lock_wait_timeout=1; +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE t1 ADD INDEX idx(value); +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE t1 ADD INDEX idx(value); + +--echo # Connection default +--connection default +SELECT * FROM t1; +COMMIT; + +DROP TABLE t1; +disconnect con1; + + # 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_table.cc' --- a/sql/sql_table.cc 2011-03-25 14:03:44 +0000 +++ b/sql/sql_table.cc 2011-03-30 13:27:50 +0000 @@ -6591,7 +6591,28 @@ bool mysql_alter_table(THD *thd,char *ne my_casedn_str(files_charset_info, old_name); if (wait_while_table_is_used(thd, table, HA_EXTRA_PREPARE_FOR_RENAME)) + { + // If lock upgrade fails, we must drop any indexes recently added. + if (index_add_count) + { + /* + Temporarily set table-key_info to include information about the + indexes added above that we now need to drop. + */ + KEY *save_key_info= table->key_info; + table->key_info= key_info_buffer; + if ((error= table->file->prepare_drop_index(table, index_add_buffer, + index_add_count))) + table->file->print_error(error, MYF(0)); + else if ((error= table->file->final_drop_index(table))) + table->file->print_error(error, MYF(0)); + table->key_info= save_key_info; + // Reopen the table to rebuild the index translation table. + Open_table_context ot_ctx(thd, MYSQL_OPEN_REOPEN); + DBUG_ASSERT(!open_table(thd, table_list, thd->mem_root, &ot_ctx)); + } goto err_new_table_cleanup; + } close_all_tables_for_name(thd, table->s, --===============9024280395367230113== 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.5-bug11853126/ # testament_sha1: 01874fb0e1b36cf42d167c0b62a5362f40c88a5f # timestamp: 2011-03-30 15:27:54 +0200 # base_revision_id: sergey.glukhov@stripped\ # nb35en7ibk3mr9sr # # Begin bundle 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 --===============9024280395367230113==--