Fixed bug#56619 - Assertion failed during
ALTER TABLE RENAME, DISABLE KEYS. The code of ALTER TABLE RENAME, DISABLE KEYS could issue a commit while holding LOCK_open mutex. This is a regression introduced by the fix for Bug 54453. This failed an assert guarding us against a potential deadlock with connections trying to execute FLUSH TABLES WITH READ LOCK. The fix is to move acquisition of LOCK_open outside the section that issues ha_autocommit_or_rollback(). LOCK_open is taken to protect against concurrent operations with .frms and the table definition cache, and doesn't need to cover the call to commit. A test case added to innodb_mysql.test. The patch is to be null-merged to 5.5, which already has 54453 null-merged to it. mysql-test/suite/innodb/r/innodb_mysql.result: Added test results for test for bug#56619. mysql-test/suite/innodb/t/innodb_mysql.test: Added test for bug#56619. sql/sql_table.cc: mysql_alter_table() modified: moved acquisition of LOCK_open after call to ha_autocommit_or_rollback.
This commit is contained in:
parent
2c16c7e985
commit
4b0fe88708
@ -2620,3 +2620,11 @@ t2 CREATE TABLE `t2` (
|
|||||||
CONSTRAINT `x` FOREIGN KEY (`fk`) REFERENCES `t1` (`pk`)
|
CONSTRAINT `x` FOREIGN KEY (`fk`) REFERENCES `t1` (`pk`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
drop table t2, t1;
|
drop table t2, t1;
|
||||||
|
#
|
||||||
|
# Test for bug #56619 - Assertion failed during
|
||||||
|
# ALTER TABLE RENAME, DISABLE KEYS
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1, t2;
|
||||||
|
CREATE TABLE t1 (a INT, INDEX(a)) engine=innodb;
|
||||||
|
ALTER TABLE t1 RENAME TO t2, DISABLE KEYS;
|
||||||
|
DROP TABLE IF EXISTS t1, t2;
|
||||||
|
@ -845,3 +845,16 @@ create table t2 (fk int, key x (fk),
|
|||||||
constraint x foreign key (FK) references t1 (PK)) engine=InnoDB;
|
constraint x foreign key (FK) references t1 (PK)) engine=InnoDB;
|
||||||
show create table t2;
|
show create table t2;
|
||||||
drop table t2, t1;
|
drop table t2, t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Test for bug #56619 - Assertion failed during
|
||||||
|
--echo # ALTER TABLE RENAME, DISABLE KEYS
|
||||||
|
--echo #
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1, t2;
|
||||||
|
--enable_warnings
|
||||||
|
CREATE TABLE t1 (a INT, INDEX(a)) engine=innodb;
|
||||||
|
--disable_warnings
|
||||||
|
ALTER TABLE t1 RENAME TO t2, DISABLE KEYS;
|
||||||
|
DROP TABLE IF EXISTS t1, t2;
|
||||||
|
--enable_warnings
|
||||||
|
@ -6832,7 +6832,6 @@ view_err:
|
|||||||
table->alias);
|
table->alias);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&LOCK_open));
|
|
||||||
/*
|
/*
|
||||||
Unlike to the above case close_cached_table() below will remove ALL
|
Unlike to the above case close_cached_table() below will remove ALL
|
||||||
instances of TABLE from table cache (it will also remove table lock
|
instances of TABLE from table cache (it will also remove table lock
|
||||||
@ -6853,6 +6852,7 @@ view_err:
|
|||||||
*/
|
*/
|
||||||
ha_autocommit_or_rollback(thd, 0);
|
ha_autocommit_or_rollback(thd, 0);
|
||||||
|
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_open));
|
||||||
/*
|
/*
|
||||||
Then do a 'simple' rename of the table. First we need to close all
|
Then do a 'simple' rename of the table. First we need to close all
|
||||||
instances of 'source' table.
|
instances of 'source' table.
|
||||||
@ -6885,6 +6885,8 @@ view_err:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_open));
|
||||||
|
|
||||||
if (error == HA_ERR_WRONG_COMMAND)
|
if (error == HA_ERR_WRONG_COMMAND)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user