File: session_temp_tablespaces.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (325 lines) | stat: -rw-r--r-- 12,712 bytes parent folder | download
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
################################################################################
# InnoDB: Reclaim disk space occupied by temporary tables online.
# This test case will test
#    - Starting server with innodb_temp_tablespaces_dir system variable
#    - Initial number of .ibt files and their size
#    - Info population in INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES
#    - New set of .ibt files getting allocated once initial set is exausted
#    - Session tablespaces getting allocated for explicit temporary tables
#    - Session tablespaces getting allocated for intrinsic temporary tables
#    - Purpose/state of .ibt files getting displayed
#    - Space getting reclaimed on disconnection
#    - Test with invalid values of innodb_temp_tablespaces_dir
#    - Disk full scenario
#    - Creating workload and executing queries involving intrinsic tables
################################################################################

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

--mkdir $MYSQLTEST_VARDIR/tmp/wl11613_dir/
let $restart_parameters = "restart: --innodb_temp_tablespaces_dir=$MYSQLTEST_VARDIR/tmp/wl11613_dir";
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--source include/restart_mysqld.inc
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
SELECT @@innodb_temp_tablespaces_dir;

--echo # Check the initial number of .ibt files and their size
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

--echo # Check connection_id() of session is populated correctly in
--echo # ID column of INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES  WHERE ID = connection_id();

--echo # Check the default location of innodb_temp_tablespaces_dir
let $restart_parameters=;
--source include/restart_mysqld.inc
let $MYSQLD_DATADIR=`SELECT @@datadir`;

--replace_regex /\.[\\\/]#innodb_temp[\\\/]/#innodb_temp/
SELECT @@innodb_temp_tablespaces_dir;

# Using on disk tablespace for intrinsic optimiser tables
SET GLOBAL big_tables=ON;

--echo # Create a new connection.
connect (con1, localhost, root,,);

connection con1;

--echo # A session tablespace will be allocated to connection 1
--echo # for explicit temporary tables and state will be active

CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
CREATE TEMPORARY TABLE test.t2(a INT, b BLOB);
INSERT INTO t1 values (1, 'hello'), (2, 'hi'), (3, 'wl11613'), (4, 'temp'), (5, 'tablespace');
INSERT INTO t2 values (1, 'hello'), (2, 'hi'), (3, 'wl11613'), (4, 'temp'), (5, 'tablespace');

INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;

--echo # Create a new connection.
connect (con2, localhost, root,,);
connection con2;

--echo # A session tablespace will be allocated to connection 2
--echo # for explicit temporary tables
--echo # One more session tablespace will be allocated for intrinsic
--echo # temporary tables on executing select query from
--echo # INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES
--echo # State for both tablespaces would be active
--echo # The purpose for internal tablespace would be intrinsic
--echo # The purpose for tablespace for user defined temporary tables
--echo # would be USER
--echo # The purpose of inactive(unallocated) tablespaces would be none

CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
CREATE TEMPORARY TABLE test.t2(a INT, b BLOB);
INSERT INTO t1 values (1, 'hello'), (2, 'hi'), (3, 'wl11613'), (4, 'temp'), (5, 'tablespace');
INSERT INTO t2 values (1, 'hello'), (2, 'hi'), (3, 'wl11613'), (4, 'temp'), (5, 'tablespace');
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;

--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

--echo # Ensure entries in information_schema.processlist and
--echo # information_schema.innodb_session_temp_tablespaces are
--echo # in sync

SELECT USER, b.STATE, INFO, SIZE, a.STATE, PURPOSE FROM
  INFORMATION_SCHEMA.PROCESSLIST a, INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES b
  WHERE a.ID=b.ID ORDER BY SPACE;

# Creating more connections to see if a new set of session tablespaces
# get created once initial set of 10 ibt files get allocated.

--echo # Create a new connection.
connect (con3, localhost, root,,);
connection con3;

CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

--echo # Create a new connection.
connect (con4, localhost, root,,);
connection con4;

CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

--echo # Create a new connection.
connect (con5, localhost, root,,);
connection con5;

CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

--echo # Create a new connection.
connect (con6, localhost, root,,);
connection con6;

--echo # This CREATE will cause 10 more session temporary tablespaces to be
--echo # created.  Use a debug flag to simulate a failure in fallocate on Linux
--echo # so the code will fall back to setting the file size by writing zeros.
SET SESSION DEBUG = "+d,fil_create_temp_tablespace_fail_fallocate";
CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
SET SESSION DEBUG = "-d,fil_create_temp_tablespace_fail_fallocate";

# At this point, all 10 tablespaces have been allocated.
# On executing select query from INNODB_SESSION_TEMP_TABLESPACES,
# new set of 10 ibt files would be created

--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

disconnect con1;
disconnect con2;
disconnect con3;
disconnect con4;
disconnect con5;
disconnect con6;

--echo # Space would now be reclaimed and state for all sessions would be inactive
--echo # in INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES except for one
--echo # intrinsic tablespace for default connection when select query from
--echo # INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACE is executed from
--echo # default connection
connection default;
# wait for all the connections to go away and release the temporary tablespaces
let $wait_timeout= 60;
let $wait_condition= SELECT COUNT(*) = 1 from INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES WHERE STATE = 'ACTIVE';
--source include/wait_condition.inc
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

--source include/shutdown_mysqld.inc
--echo "List files in #innodb_temp. It should be empty"
--list_files $MYSQLD_DATADIR/#innodb_temp/
--echo "Check if ibtmp1 exists in datadir. There should be no ibtmp1"
--error 1
--file_exists $MYSQLD_DATADIR/ibtmp1

# Note: Relative path for innodb_temp_tablespaces_dir is with respect to datadir.
# Any directory inside datadir is not allowed for innodb_temp_tablespaces_dir

--echo "Test with invalid values of innodb_temp_tablespaces_dir"
--echo "invalid abc dir"
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir="abc"

--echo "invalid ./sys/ dir"
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir="./sys/"

--echo "invalid /wl11613-do-not-exists/ dir"
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir="/wl11613-do-not-exist/"

--echo "invalid empty \"\" "
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir=""

--echo "invalid #innodb_temp "
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir="#innodb_temp"

# Remove #innodb_temp directory manually and check if on next restart the
# directory is getting created or not. It should be created and server
# should successfully start

--rmdir $MYSQLD_DATADIR/#innodb_temp
let $restart_parameters=;
--source include/start_mysqld.inc

--echo "Check if ibtmp1 exists in datadir. It should be recreated on restart"
--file_exists $MYSQLD_DATADIR/ibtmp1

# Create a dummy file in #innodb_temp directory manually and see if
# this is shown in INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES

--write_file $MYSQLD_DATADIR/#innodb_temp/temp_11.ibt
test contents
EOF

--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

--echo # Simulating disk space full scenario
SET GLOBAL big_tables=ON;

--replace_regex /\.[\\\/]#innodb_temp[\\\/]/#innodb_temp/
SELECT @@innodb_temp_tablespaces_dir;

--echo # Create a new connection.
connect (con1, localhost, root,,);

connection con1;
SET SESSION DEBUG='+d,ibt_pool_exhausted';
--error ER_NO_SESSION_TEMP
CREATE TEMPORARY TABLE t1 (a INT);
SET SESSION DEBUG='-d,ibt_pool_exhausted';

CREATE TABLE t3(a INT, b BLOB);
INSERT INTO t3 VALUES (1, 'hi'), (2, 'hello');

SET SESSION DEBUG='+d,ibt_pool_exhausted';
--replace_regex /tablespace.*failed/tablespace failed/
--error ER_NO_SESSION_TEMP
INSERT INTO t3 SELECT * FROM t3;
SET SESSION DEBUG='-d,ibt_pool_exhausted';

--echo # Create Workload and execute queries involving intrinsic tables.

let $wl6737_auto_inc = auto_increment;
--disable_result_log
--disable_query_log

--source suite/innodb/include/create_workload_itt.inc
--source suite/innodb/include/query_workload_itt.inc

--enable_query_log
--enable_result_log

--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

disconnect con1;
connection default;
--sleep 2
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

--source suite/innodb/include/drop_workload_itt.inc
SET GLOBAL big_tables=default;
--force-rmdir $MYSQLTEST_VARDIR/tmp/wl11613_dir/

# tablespace identifier for temporary tablespace is allowed
# with INNODB_STRICT_MODE ON as well as OFF
set @@innodb_strict_mode=0;
CREATE TEMPORARY table t1(a INT) TABLESPACE=innodb_temporary;
set @@innodb_strict_mode=1;
CREATE TEMPORARY table t2(a INT) TABLESPACE=innodb_temporary;
SHOW WARNINGS;

CREATE TEMPORARY TABLE t3 (a INT);
ALTER TABLE t3 TABLESPACE innodb_temporary;
SHOW WARNINGS;

--error ER_ILLEGAL_HA_CREATE_OPTION
CREATE TEMPORARY TABLE t4 (a INT) TABLESPACE=innodb_system;

--error ER_RESERVED_TABLESPACE_NAME
CREATE TEMPORARY TABLE t4 (a INT) TABLESPACE=mysql;

CREATE TABLESPACE tbs ADD DATAFILE 'tbs.ibd' engine=INNODB;
--error ER_ILLEGAL_HA_CREATE_OPTION
CREATE TEMPORARY TABLE t4 (a INT) TABLESPACE=tbs;


--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;

--echo #########################################################################
--echo # Cleanup
--echo #########################################################################
DROP TABLESPACE tbs;

--disable_query_log
call mtr.add_suppression("Unable to allocate temporary tablespace for this session");
call mtr.add_suppression("Failed to preallocate data for file");
--enable_query_log