mariadb/mysql-test/suite/clone/t/local_file_extend.test

177 lines
5.8 KiB
Text

# Test clone when tablespace file size is increasing in different stages
# This would follow a rollback during recovery
--source include/have_innodb.inc
--source include/have_debug_sync.inc
--source include/count_sessions.inc
## Install plugin
--let $CLONE_DATADIR = $MYSQL_TMP_DIR/data_new
--replace_result $MARIADB_CLONE_SO CLONE_PLUGIN
--eval INSTALL PLUGIN clone SONAME '$MARIADB_CLONE_SO'
## Create test schema
--source ../include/create_schema.inc
## Execute Clone while concurrent DMLs are in progress
# Insert 20 rows
call execute_dml(0, 0, 20, 20, 10, 0);
# Check base rows
SHOW CREATE TABLE t1;
SELECT count(*) from t1;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 LIMIT 10;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 DESC LIMIT 10;
SHOW CREATE TABLE t2;
SELECT count(*) from t2;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 LIMIT 10;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 DESC LIMIT 10;
## Test-1: Extend tablespace file during file copy
--echo # In connection default - Cloning database
SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_insert1 WAIT_FOR resume_clone1';
--replace_result $CLONE_DATADIR CLONE_DATADIR
--send_eval CLONE LOCAL DATA DIRECTORY = '$CLONE_DATADIR'
--echo # In connection con1 - Insert [20 Rows - No commit]
connect (con1,localhost,root,,);
SET DEBUG_SYNC = 'now WAIT_FOR start_insert1';
START TRANSACTION;
SELECT FILE_SIZE into @t1_file_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME LIKE 'test/t1';
call execute_dml(0, 50, 20, 20, 500, 0);
SELECT FILE_SIZE > @t1_file_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME LIKE 'test/t1';
--echo # Flush all dirty buffers
SET GLOBAL innodb_buf_flush_list_now = 1;
SET DEBUG_SYNC = 'now SIGNAL resume_clone1';
connection default;
--echo # In connection default - Cloning database
--reap
--echo # In connection con1
connection con1;
ROLLBACK;
connection default;
--echo # In connection default - Cloning database
disconnect con1;
--echo # Restart cloned database
--let restart_noprint=1
--let restart_parameters=--datadir=$CLONE_DATADIR
--source include/restart_mysqld.inc
# Check table in cloned database
SHOW CREATE TABLE t1;
SELECT count(*) from t1;
SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 LIMIT 10;
SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 DESC LIMIT 10;
SHOW CREATE TABLE t2;
SELECT count(*) from t2;
SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 LIMIT 10;
SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 DESC LIMIT 10;
# Execute procedure to delete all rows and insert
call execute_dml(3, 0, 1, 1, 1, 0);
call execute_dml(0, 0, 10, 10, 2, 0);
commit;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 LIMIT 10;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 DESC LIMIT 10;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 LIMIT 10;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 DESC LIMIT 10;
#Cleanup
--let restart_parameters=
--source include/restart_mysqld.inc
--rmdir $CLONE_DATADIR
## Test-2: Extend tablespace file during page copy
--echo # In connection default - Cloning database
SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_dml WAIT_FOR resume_clone2';
SET DEBUG_SYNC = 'clone_page_copy SIGNAL start_insert2 WAIT_FOR resume_clone3';
--replace_result $CLONE_DATADIR CLONE_DATADIR
--send_eval CLONE LOCAL DATA DIRECTORY = '$CLONE_DATADIR'
--echo # In connection con1 - Insert [20 Rows - No commit]
connect (con1,localhost,root,,);
SET DEBUG_SYNC = 'now WAIT_FOR start_dml';
START TRANSACTION;
SELECT FILE_SIZE into @t1_file_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME LIKE 'test/t1';
call execute_dml(1, 0, 20, 20, 10, 1);
SELECT FILE_SIZE > @t1_file_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME LIKE 'test/t1';
COMMIT;
--echo # Flush all dirty buffers
SET GLOBAL innodb_buf_flush_list_now = 1;
SET DEBUG_SYNC = 'now SIGNAL resume_clone2';
connection con1;
SET DEBUG_SYNC = 'now WAIT_FOR start_insert2';
START TRANSACTION;
call execute_dml(0, 50, 20, 20, 500, 0);
--echo # Flush all dirty buffers
SET GLOBAL innodb_buf_flush_list_now = 1;
SET DEBUG_SYNC = 'now SIGNAL resume_clone3';
connection default;
--echo # In connection default - Cloning database
--replace_result $CLONE_DATADIR CLONE_DATADIR
--reap
--echo # In connection con1
connection con1;
ROLLBACK;
connection default;
--echo # In connection default - Cloning database
disconnect con1;
--echo # Restart cloned database
--replace_result $CLONE_DATADIR CLONE_DATADIR
--let restart_parameters=--datadir=$CLONE_DATADIR
--source include/restart_mysqld.inc
# Check table in cloned database
SHOW CREATE TABLE t1;
SELECT count(*) from t1;
SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 LIMIT 10;
SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 DESC LIMIT 10;
SHOW CREATE TABLE t2;
SELECT count(*) from t2;
SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 LIMIT 10;
SELECT col1, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 DESC LIMIT 10;
# Execute procedure to delete all rows and insert
call execute_dml(3, 0, 1, 1, 1, 0);
call execute_dml(0, 0, 10, 10, 2, 0);
commit;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 LIMIT 10;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t1 ORDER BY col1 DESC LIMIT 10;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 LIMIT 10;
SELECT col1, col2, col3, SUBSTRING(col4, 1000, 32) FROM t2 ORDER BY col1 DESC LIMIT 10;
#Cleanup
--let restart_parameters=
--source include/restart_mysqld.inc
--source ../include/drop_schema.inc
UNINSTALL PLUGIN clone;
SET DEBUG_SYNC = 'RESET';
--source include/wait_until_count_sessions.inc
--rmdir $CLONE_DATADIR