Browse Source
Bug#12400341 INNODB CAN LEAVE ORPHAN IBD FILES AROUND
Bug#12400341 INNODB CAN LEAVE ORPHAN IBD FILES AROUND
If we meet DB_TOO_MANY_CONCURRENT_TRXS during the execution tab_create_graph from row_create_table_for_mysql(), .ibd file for the table should be created already but was not deleted for the error handling. rb:875 approved by Jimmy Yangpull/843/head
10 changed files with 174 additions and 1 deletions
-
25mysql-test/suite/innodb/r/innodb_bug12400341.result
-
1mysql-test/suite/innodb/t/innodb_bug12400341-master.opt
-
103mysql-test/suite/innodb/t/innodb_bug12400341.test
-
1mysql-test/suite/sys_vars/r/all_vars.result
-
1mysql-test/suite/sys_vars/t/all_vars.test
-
10storage/innobase/handler/ha_innodb.cc
-
9storage/innobase/include/trx0rseg.ic
-
6storage/innobase/include/trx0sys.h
-
14storage/innobase/row/row0mysql.c
-
5storage/innobase/trx/trx0sys.c
@ -0,0 +1,25 @@ |
|||
call mtr.add_suppression("InnoDB: Warning: cannot find a free slot for an undo log. Do you have too"); |
|||
show variables like "max_connections"; |
|||
Variable_name Value |
|||
max_connections 64 |
|||
show variables like "innodb_thread_concurrency"; |
|||
Variable_name Value |
|||
innodb_thread_concurrency 0 |
|||
show variables like "innodb_file_per_table"; |
|||
Variable_name Value |
|||
innodb_file_per_table ON |
|||
drop database if exists mysqltest; |
|||
create database mysqltest; |
|||
CREATE TABLE mysqltest.transtable (id int unsigned NOT NULL PRIMARY KEY, val int DEFAULT 0) ENGINE=InnoDB; |
|||
select count(*) from information_schema.processlist; |
|||
count(*) |
|||
33 |
|||
CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB; |
|||
ERROR HY000: Can't create table 'mysqltest.testtable' (errno: 177) |
|||
select count(*) from information_schema.processlist; |
|||
count(*) |
|||
33 |
|||
select count(*) from information_schema.processlist; |
|||
count(*) |
|||
33 |
|||
drop database mysqltest; |
|||
@ -0,0 +1 @@ |
|||
--max_connections=64 --innodb_thread_concurrency=0 --innodb_file_per_table --innodb_rollback_segments=2 |
|||
@ -0,0 +1,103 @@ |
|||
# Test for bug #12400341: INNODB CAN LEAVE ORPHAN IBD FILES AROUND |
|||
|
|||
-- source include/have_innodb.inc |
|||
|
|||
if (`select count(*)=0 from information_schema.global_variables where variable_name = 'INNODB_TRX_RSEG_N_SLOTS_DEBUG'`) |
|||
{ |
|||
--skip Test requires InnoDB built with UNIV_DEBUG definition. |
|||
} |
|||
|
|||
call mtr.add_suppression("InnoDB: Warning: cannot find a free slot for an undo log. Do you have too"); |
|||
|
|||
--disable_query_log |
|||
set @old_innodb_trx_rseg_n_slots_debug = @@innodb_trx_rseg_n_slots_debug; |
|||
set global innodb_trx_rseg_n_slots_debug = 32; |
|||
--enable_query_log |
|||
|
|||
show variables like "max_connections"; |
|||
show variables like "innodb_thread_concurrency"; |
|||
show variables like "innodb_file_per_table"; |
|||
|
|||
--disable_warnings |
|||
drop database if exists mysqltest; |
|||
--enable_warnings |
|||
|
|||
create database mysqltest; |
|||
CREATE TABLE mysqltest.transtable (id int unsigned NOT NULL PRIMARY KEY, val int DEFAULT 0) ENGINE=InnoDB; |
|||
|
|||
--disable_query_log |
|||
# |
|||
# Insert in 1 transaction which needs over 1 page undo record to avoid the insert_undo cached, |
|||
# because the cached insert_undo can be reused at "CREATE TABLE" statement later. |
|||
# |
|||
START TRANSACTION; |
|||
let $c = 1024; |
|||
while ($c) |
|||
{ |
|||
eval INSERT INTO mysqltest.transtable (id) VALUES ($c); |
|||
dec $c; |
|||
} |
|||
COMMIT; |
|||
|
|||
let $c = 32; |
|||
while ($c) |
|||
{ |
|||
# if failed at here, it might be shortage of file descriptors limit. |
|||
connect (con$c,localhost,root,,); |
|||
dec $c; |
|||
} |
|||
--enable_query_log |
|||
|
|||
select count(*) from information_schema.processlist; |
|||
|
|||
# |
|||
# fill the all undo slots |
|||
# |
|||
--disable_query_log |
|||
let $c = 32; |
|||
while ($c) |
|||
{ |
|||
connection con$c; |
|||
START TRANSACTION; |
|||
eval UPDATE mysqltest.transtable SET val = 1 WHERE id = 33 - $c; |
|||
dec $c; |
|||
} |
|||
--enable_query_log |
|||
|
|||
connection default; |
|||
|
|||
--error ER_CANT_CREATE_TABLE |
|||
CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB; |
|||
|
|||
select count(*) from information_schema.processlist; |
|||
|
|||
--disable_query_log |
|||
let $c = 32; |
|||
while ($c) |
|||
{ |
|||
connection con$c; |
|||
ROLLBACK; |
|||
dec $c; |
|||
} |
|||
--enable_query_log |
|||
|
|||
connection default; |
|||
select count(*) from information_schema.processlist; |
|||
|
|||
--disable_query_log |
|||
let $c = 32; |
|||
while ($c) |
|||
{ |
|||
disconnect con$c; |
|||
dec $c; |
|||
} |
|||
--enable_query_log |
|||
|
|||
# |
|||
# If the isolated .ibd file remained, the drop database should fail. |
|||
# |
|||
drop database mysqltest; |
|||
|
|||
--disable_query_log |
|||
set global innodb_trx_rseg_n_slots_debug = @old_innodb_trx_rseg_n_slots_debug; |
|||
--enable_query_log |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue