polardbxengine/mysql-test/suite/ndb_ddl/tablespace_mdl.test

247 lines
5.5 KiB
Plaintext

--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;
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 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;
ALTER TABLESPACE ts1
DROP DATAFILE 'ts1_datafile.dat';
DROP TABLESPACE ts1;
DROP LOGFILE GROUP lg1
ENGINE NDB;