File: tablespace_mdl.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 (259 lines) | stat: -rw-r--r-- 6,123 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
--source include/have_ndb.inc

#
# Test MDL on tablespaces. Locks on tablespaces are taken in the following
# cases:
#
# 1. Tablespace DDL - X lock
# 2. Disk data table DDL - IX lock
# 3. Metadata change detection - SHARED lock
#

#
# Testcase 1: Parallel disk data table DDL queries using the same tablespace
#

# Create logfile group
CREATE LOGFILE GROUP lg1
  ADD UNDOFILE 'lg1_undofile.dat'
  INITIAL_SIZE 1M
  UNDO_BUFFER_SIZE = 1M
  ENGINE NDB;

# Create tablespace using the logfile group
CREATE TABLESPACE ts1
  ADD DATAFILE 'ts1_datafile.dat'
  USE LOGFILE GROUP lg1
  INITIAL_SIZE 16M
  ENGINE NDB;

# Procedure p1 communicates through the `procedure_control` table
CREATE TABLE procedure_control(
  stop_flag INT
) ENGINE NDB;

DELIMITER //;
CREATE PROCEDURE p1()
BEGIN
  DECLARE done INT DEFAULT 0;
  REPEAT
    CREATE TABLE t1 (
      a INT PRIMARY KEY,
      b VARCHAR(255)
    )
    ENGINE NDB TABLESPACE ts1 STORAGE DISK;
    DROP TABLE t1;
    SELECT stop_flag INTO done FROM procedure_control;
  UNTIL done END REPEAT;
END//
DELIMITER ;//

INSERT INTO procedure_control VALUE(0);

# Run CREATE + DROP TABLE queries in parallel across 2 connections
--echo Start background load of CREATE + DROP TABLE t1 which uses tablespace ts1
--send CALL p1()

# Create another connection
--connect (con2,127.0.0.1,root,,test,$MASTER_MYPORT,)
--connection con2
--echo Start CREATE + DROP TABLE t2 which uses tablespace ts1
--disable_query_log
--let $count = 1
while ($count <= 30)
{
  CREATE TABLE t2 (
    a INT PRIMARY KEY,
    b VARCHAR(255)
  )
  ENGINE NDB TABLESPACE ts1 STORAGE DISK;
  DROP TABLE t2;
  --inc $count
}
--enable_query_log

# Signal procedure to stop background queries
UPDATE procedure_control SET stop_flag=1;

--connection default
--echo Wait for background load to complete
--reap

# Cleanup
DROP PROCEDURE p1;
DROP TABLE procedure_control;
ALTER TABLESPACE ts1
  DROP DATAFILE 'ts1_datafile.dat';
DROP TABLESPACE ts1;
DROP LOGFILE GROUP lg1
  ENGINE NDB;

#
# Testcase 2: Parallel tablespace and disk data table DDL queries
#

# Create logfile group
CREATE LOGFILE GROUP lg1
  ADD UNDOFILE 'lg1_undofile.dat'
  INITIAL_SIZE 1M
  UNDO_BUFFER_SIZE = 1M
  ENGINE NDB;

# Create tablespace using the logfile group
CREATE TABLESPACE ts1
  ADD DATAFILE 'ts1_datafile.dat'
  USE LOGFILE GROUP lg1
  INITIAL_SIZE 16M
  ENGINE NDB;

# Procedure p1 communicates through 'procedure_control' table
CREATE TABLE procedure_control(
  stop_flag INT
) ENGINE NDB;

# The query of the 'dummy' table in procedure p1() helps
# speed up the test by creating more opportunities to the
# CREATE/DROP TABLE statement to acquire the global schema
# lock. These statements are often the ones 'victimized'
# by deadlock detection and lose out in terms of contention
# for the GSL.
CREATE TABLE dummy (
  a INT PRIMARY KEY
) ENGINE NDB;
INSERT INTO dummy VALUES (1), (2), (3), (4), (5);

DELIMITER //;
CREATE PROCEDURE p1()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE dummy_var INT DEFAULT 5;
  REPEAT
    ALTER TABLESPACE ts1
      ADD DATAFILE 'ts1_datafile2.dat';
    ALTER TABLESPACE ts1
      DROP DATAFILE 'ts1_datafile2.dat';
    SELECT stop_flag INTO done FROM procedure_control;
    SELECT a INTO dummy_var FROM dummy WHERE a > 4;
  UNTIL done END REPEAT;
END//
DELIMITER ;//

INSERT INTO procedure_control VALUE(0);

# Run CREATE + DROP TABLE and ALTER TABLESPACE queries in parallel
--echo Start background load of ALTER TABLESPACE ts1 ADD/DROP DATAFILE
--send CALL p1()

--connection con2
--echo Start CREATE + DROP TABLE t1 which uses tablespace ts1
--disable_query_log
--let $count = 1
while ($count <= 30)
{
  # 0 - No error
  # ER_LOCK_DEADLOCK - Transaction encountered deadlock
  # ER_TABLE_EXISTS_ERROR - In case the previous DROP TABLE failed
  --error 0,ER_LOCK_DEADLOCK,ER_TABLE_EXISTS_ERROR
  CREATE TABLE t1 (
    a INT PRIMARY KEY,
    b VARCHAR(255)
  )
  ENGINE NDB TABLESPACE ts1 STORAGE DISK;
  # 0 - No error
  # ER_LOCK_DEADLOCK - Transaction encountered deadlock
  # ER_BAD_TABLE_ERROR - In case the previous CREATE TABLE failed
  --error 0,ER_LOCK_DEADLOCK,ER_BAD_TABLE_ERROR
  DROP TABLE t1;
  --inc $count
}
--enable_query_log

# Signal procedure to stop background queries
UPDATE procedure_control SET stop_flag=1;

--connection default
--echo Wait for background load to complete
--error 0,ER_LOCK_DEADLOCK
--reap

# Cleanup
DROP PROCEDURE p1;
DROP TABLE procedure_control;
ALTER TABLESPACE ts1
  DROP DATAFILE 'ts1_datafile.dat';
DROP TABLESPACE ts1;
DROP LOGFILE GROUP lg1
  ENGINE NDB;

#
# Testcase 3: Parallel tablespace DDL queries
#

# Create logfile group
CREATE LOGFILE GROUP lg1
  ADD UNDOFILE 'lg1_undofile.dat'
  INITIAL_SIZE 1M
  UNDO_BUFFER_SIZE = 1M
  ENGINE NDB;

# Create tablespace using the logfile group
CREATE TABLESPACE ts1
  ADD DATAFILE 'ts1_datafile.dat'
  USE LOGFILE GROUP lg1
  INITIAL_SIZE 16M
  ENGINE NDB;

# Procedure p1 communicates through 'procedure_control' table
CREATE TABLE procedure_control(
  stop_flag INT
) ENGINE NDB;

DELIMITER //;
CREATE PROCEDURE p1()
BEGIN
  DECLARE done INT DEFAULT 0;
  REPEAT
    ALTER TABLESPACE ts1
      ADD DATAFILE 'ts1_datafile2.dat';
    ALTER TABLESPACE ts1
      DROP DATAFILE 'ts1_datafile2.dat';
    SELECT stop_flag INTO done FROM procedure_control;
  UNTIL done END REPEAT;
END//
DELIMITER ;//

INSERT INTO procedure_control VALUE(0);

# Run ALTER TABLESPACE queries in parallel
--echo Start background load of ALTER TABLESPACE ts1 ADD/DROP DATAFILE
--send CALL p1()

--connection con2
--echo Start ALTER TABLESPACE ts1 ADD/DROP DATAFILE
--disable_query_log
--let $count = 1
while ($count <= 30)
{
  ALTER TABLESPACE ts1
    ADD DATAFILE 'ts1_datafile3.dat';
  ALTER TABLESPACE ts1
    DROP DATAFILE 'ts1_datafile3.dat';
  --inc $count
}
--enable_query_log

# Signal procedure to stop background queries
UPDATE procedure_control SET stop_flag=1;

--connection default
--echo Wait for background load to complete
--reap

# Cleanup
DROP PROCEDURE p1;
DROP TABLE procedure_control,dummy;
ALTER TABLESPACE ts1
  DROP DATAFILE 'ts1_datafile.dat';
DROP TABLESPACE ts1;
DROP LOGFILE GROUP lg1
  ENGINE NDB;