summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/innodb/t/innodb_bug12400341.test
blob: 13eadc70beec99cb0b2f78b3fa2d53508181e6cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# Test for bug #12400341: INNODB CAN LEAVE ORPHAN IBD FILES AROUND

-- source include/have_debug.inc
-- source include/have_innodb.inc
-- source include/have_innodb_16k.inc

# Don't test under valgrind, undo slots of the previous test might exist still
# and cause unstable result.
--source include/not_valgrind.inc
# undo slots of the previous test might exist still
--source include/not_windows.inc

call mtr.add_suppression("\\[Warning\\] InnoDB: 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

--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 where command != 'Daemon';

#
# 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 where command != 'Daemon';

--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 where command != 'Daemon';

--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