Commit 4bce198c authored by Mattias Jonsson's avatar Mattias Jonsson

manual merge fix of bug#42438 in mysql-next-mr-merge

parent d34ded97
...@@ -4,6 +4,8 @@ SET DEBUG_SYNC= 'RESET'; ...@@ -4,6 +4,8 @@ SET DEBUG_SYNC= 'RESET';
# Bug#42438: Crash ha_partition::change_table_ptr # Bug#42438: Crash ha_partition::change_table_ptr
# Test when remove partitioning is done while drop table is waiting # Test when remove partitioning is done while drop table is waiting
# for the table. # for the table.
# After MDL was introduced, there is no longer any race, so test is done
# by adding a small sleep to verify that the delete waits.
# Con 1 # Con 1
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';
CREATE TABLE t1 CREATE TABLE t1
...@@ -16,21 +18,25 @@ ENGINE = MYISAM ...@@ -16,21 +18,25 @@ ENGINE = MYISAM
PARTITION p1 VALUES LESS THAN (20), PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (100),
PARTITION p3 VALUES LESS THAN MAXVALUE ) */; PARTITION p3 VALUES LESS THAN MAXVALUE ) */;
SET SESSION debug= "+d,sleep_before_create_table_no_lock";
SET DEBUG_SYNC= 'alter_table_before_create_table_no_lock SIGNAL removing_partitioning WAIT_FOR waiting_for_alter'; SET DEBUG_SYNC= 'alter_table_before_create_table_no_lock SIGNAL removing_partitioning WAIT_FOR waiting_for_alter';
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL partitioning_removed'; SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL partitioning_removed';
ALTER TABLE t1 REMOVE PARTITIONING; ALTER TABLE t1 REMOVE PARTITIONING;
# Con default # Con default
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitioning'; SET DEBUG_SYNC= 'now WAIT_FOR removing_partitioning';
SET DEBUG_SYNC= 'waiting_for_table SIGNAL waiting_for_alter'; SET DEBUG_SYNC= 'mdl_acquire_lock_wait SIGNAL waiting_for_alter';
SET DEBUG_SYNC= 'rm_table_part2_before_delete_table WAIT_FOR partitioning_removed'; SET DEBUG_SYNC= 'rm_table_part2_before_delete_table WAIT_FOR partitioning_removed';
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
# Con 1 # Con 1
SET SESSION debug= "-d,sleep_before_create_table_no_lock";
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';
# #
# Bug#42438: Crash ha_partition::change_table_ptr # Bug#42438: Crash ha_partition::change_table_ptr
# Test when remove partitioning is failing due to drop table is already # Test when remove partitioning is failing due to drop table is already
# in progress. # in progress.
# After MDL was introduced, there is no longer any race, so test is done
# by adding a small sleep to verify that the alter waits.
CREATE TABLE t2 CREATE TABLE t2
(a INTEGER, (a INTEGER,
b INTEGER NOT NULL, b INTEGER NOT NULL,
...@@ -41,14 +47,16 @@ ENGINE = MYISAM ...@@ -41,14 +47,16 @@ ENGINE = MYISAM
PARTITION p1 VALUES LESS THAN (20), PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (100),
PARTITION p3 VALUES LESS THAN MAXVALUE ) */; PARTITION p3 VALUES LESS THAN MAXVALUE ) */;
SET DEBUG_SYNC= 'before_lock_tables_takes_lock SIGNAL removing_partitions WAIT_FOR waiting_for_alter'; SET DEBUG_SYNC= 'open_tables_acquire_upgradable_mdl SIGNAL removing_partitions WAIT_FOR waiting_for_alter';
SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done'; SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done';
ALTER TABLE t2 REMOVE PARTITIONING; ALTER TABLE t2 REMOVE PARTITIONING;
# Con default # Con default
SET SESSION debug= "+d,sleep_before_part2_delete_table";
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions'; SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions';
SET DEBUG_SYNC= 'waiting_for_table SIGNAL waiting_for_alter'; SET DEBUG_SYNC= 'rm_table_part2_before_delete_table SIGNAL waiting_for_alter';
SET DEBUG_SYNC= 'rm_table_part2_before_binlog SIGNAL delete_done'; SET DEBUG_SYNC= 'rm_table_part2_before_binlog SIGNAL delete_done';
DROP TABLE IF EXISTS t2; DROP TABLE IF EXISTS t2;
SET SESSION debug= "-d,sleep_before_part2_delete_table";
# Con 1 # Con 1
ERROR 42S02: Table 'test.t2' doesn't exist ERROR 42S02: Table 'test.t2' doesn't exist
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';
......
...@@ -15,4 +15,3 @@ sp_sync : Bug#48157 2010-02-06 5.5-m3 demands a differnt soluti ...@@ -15,4 +15,3 @@ sp_sync : Bug#48157 2010-02-06 5.5-m3 demands a differnt soluti
innodb-autoinc : Bug#49267 2009-12-02 test fails on windows because of different case mode innodb-autoinc : Bug#49267 2009-12-02 test fails on windows because of different case mode
innodb : Bug#49396 2009-12-03 test fails in embedded mode innodb : Bug#49396 2009-12-03 test fails in embedded mode
plugin_load : Bug#42144 2009-12-21 alik plugin_load fails plugin_load : Bug#42144 2009-12-21 alik plugin_load fails
partition_debug_sync : 2010-03-01 alik Disable partition_debug_sync temporarily awaiting a patch from Mattias
...@@ -15,6 +15,8 @@ SET DEBUG_SYNC= 'RESET'; ...@@ -15,6 +15,8 @@ SET DEBUG_SYNC= 'RESET';
--echo # Bug#42438: Crash ha_partition::change_table_ptr --echo # Bug#42438: Crash ha_partition::change_table_ptr
--echo # Test when remove partitioning is done while drop table is waiting --echo # Test when remove partitioning is done while drop table is waiting
--echo # for the table. --echo # for the table.
--echo # After MDL was introduced, there is no longer any race, so test is done
--echo # by adding a small sleep to verify that the delete waits.
connect(con1, localhost, root,,); connect(con1, localhost, root,,);
--echo # Con 1 --echo # Con 1
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';
...@@ -28,18 +30,20 @@ ENGINE = MYISAM ...@@ -28,18 +30,20 @@ ENGINE = MYISAM
PARTITION p1 VALUES LESS THAN (20), PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (100),
PARTITION p3 VALUES LESS THAN MAXVALUE ) */; PARTITION p3 VALUES LESS THAN MAXVALUE ) */;
SET SESSION debug= "+d,sleep_before_create_table_no_lock";
SET DEBUG_SYNC= 'alter_table_before_create_table_no_lock SIGNAL removing_partitioning WAIT_FOR waiting_for_alter'; SET DEBUG_SYNC= 'alter_table_before_create_table_no_lock SIGNAL removing_partitioning WAIT_FOR waiting_for_alter';
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL partitioning_removed'; SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL partitioning_removed';
--send ALTER TABLE t1 REMOVE PARTITIONING --send ALTER TABLE t1 REMOVE PARTITIONING
connection default; connection default;
--echo # Con default --echo # Con default
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitioning'; SET DEBUG_SYNC= 'now WAIT_FOR removing_partitioning';
SET DEBUG_SYNC= 'waiting_for_table SIGNAL waiting_for_alter'; SET DEBUG_SYNC= 'mdl_acquire_lock_wait SIGNAL waiting_for_alter';
SET DEBUG_SYNC= 'rm_table_part2_before_delete_table WAIT_FOR partitioning_removed'; SET DEBUG_SYNC= 'rm_table_part2_before_delete_table WAIT_FOR partitioning_removed';
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
--echo # Con 1 --echo # Con 1
connection con1; connection con1;
--reap --reap
SET SESSION debug= "-d,sleep_before_create_table_no_lock";
connection default; connection default;
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';
connection con1; connection con1;
...@@ -49,6 +53,8 @@ SET DEBUG_SYNC= 'RESET'; ...@@ -49,6 +53,8 @@ SET DEBUG_SYNC= 'RESET';
--echo # Bug#42438: Crash ha_partition::change_table_ptr --echo # Bug#42438: Crash ha_partition::change_table_ptr
--echo # Test when remove partitioning is failing due to drop table is already --echo # Test when remove partitioning is failing due to drop table is already
--echo # in progress. --echo # in progress.
--echo # After MDL was introduced, there is no longer any race, so test is done
--echo # by adding a small sleep to verify that the alter waits.
CREATE TABLE t2 CREATE TABLE t2
(a INTEGER, (a INTEGER,
b INTEGER NOT NULL, b INTEGER NOT NULL,
...@@ -59,15 +65,17 @@ ENGINE = MYISAM ...@@ -59,15 +65,17 @@ ENGINE = MYISAM
PARTITION p1 VALUES LESS THAN (20), PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (100),
PARTITION p3 VALUES LESS THAN MAXVALUE ) */; PARTITION p3 VALUES LESS THAN MAXVALUE ) */;
SET DEBUG_SYNC= 'before_lock_tables_takes_lock SIGNAL removing_partitions WAIT_FOR waiting_for_alter'; SET DEBUG_SYNC= 'open_tables_acquire_upgradable_mdl SIGNAL removing_partitions WAIT_FOR waiting_for_alter';
SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done'; SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done';
--send ALTER TABLE t2 REMOVE PARTITIONING --send ALTER TABLE t2 REMOVE PARTITIONING
connection default; connection default;
--echo # Con default --echo # Con default
SET SESSION debug= "+d,sleep_before_part2_delete_table";
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions'; SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions';
SET DEBUG_SYNC= 'waiting_for_table SIGNAL waiting_for_alter'; SET DEBUG_SYNC= 'rm_table_part2_before_delete_table SIGNAL waiting_for_alter';
SET DEBUG_SYNC= 'rm_table_part2_before_binlog SIGNAL delete_done'; SET DEBUG_SYNC= 'rm_table_part2_before_binlog SIGNAL delete_done';
DROP TABLE IF EXISTS t2; DROP TABLE IF EXISTS t2;
SET SESSION debug= "-d,sleep_before_part2_delete_table";
--echo # Con 1 --echo # Con 1
connection con1; connection con1;
--error ER_NO_SUCH_TABLE --error ER_NO_SUCH_TABLE
......
...@@ -4377,6 +4377,8 @@ open_tables_acquire_upgradable_mdl(THD *thd, TABLE_LIST *tables_start, ...@@ -4377,6 +4377,8 @@ open_tables_acquire_upgradable_mdl(THD *thd, TABLE_LIST *tables_start,
MDL_request_list mdl_requests; MDL_request_list mdl_requests;
TABLE_LIST *table; TABLE_LIST *table;
DEBUG_SYNC(thd, "open_tables_acquire_upgradable_mdl");
for (table= tables_start; table && table != tables_end; for (table= tables_start; table && table != tables_end;
table= table->next_global) table= table->next_global)
{ {
......
...@@ -1897,18 +1897,15 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, ...@@ -1897,18 +1897,15 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
mysql_ha_rm_tables(thd, tables); mysql_ha_rm_tables(thd, tables);
/* Disable drop of enabled log tables, must be done before name locking */ /* Disable drop of enabled log tables, must be done before name locking */
mysql_mutex_lock(&LOCK_open);
for (table= tables; table; table= table->next_local) for (table= tables; table; table= table->next_local)
{ {
if (check_if_log_table(table->db_length, table->db, if (check_if_log_table(table->db_length, table->db,
table->table_name_length, table->table_name, 1)) table->table_name_length, table->table_name, 1))
{ {
mysql_mutex_unlock(&LOCK_open);
my_error(ER_BAD_LOG_STATEMENT, MYF(0), "DROP"); my_error(ER_BAD_LOG_STATEMENT, MYF(0), "DROP");
DBUG_RETURN(1); DBUG_RETURN(1);
} }
} }
mysql_mutex_unlock(&LOCK_open);
if (!drop_temporary) if (!drop_temporary)
{ {
...@@ -2061,6 +2058,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, ...@@ -2061,6 +2058,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
Is exclusive meta-data lock enough ? Is exclusive meta-data lock enough ?
*/ */
DEBUG_SYNC(thd, "rm_table_part2_before_delete_table"); DEBUG_SYNC(thd, "rm_table_part2_before_delete_table");
DBUG_EXECUTE_IF("sleep_before_part2_delete_table",
my_sleep(100000););
mysql_mutex_lock(&LOCK_open); mysql_mutex_lock(&LOCK_open);
if (drop_temporary || if (drop_temporary ||
((access(path, F_OK) && ((access(path, F_OK) &&
...@@ -7128,6 +7127,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -7128,6 +7127,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
create_info->data_file_name=create_info->index_file_name=0; create_info->data_file_name=create_info->index_file_name=0;
DEBUG_SYNC(thd, "alter_table_before_create_table_no_lock"); DEBUG_SYNC(thd, "alter_table_before_create_table_no_lock");
DBUG_EXECUTE_IF("sleep_before_create_table_no_lock",
my_sleep(100000););
/* /*
Create a table with a temporary name. Create a table with a temporary name.
With create_info->frm_only == 1 this creates a .frm file only. With create_info->frm_only == 1 this creates a .frm file only.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment