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
|
# Test clone error cases with concurrent DDL
--source include/have_debug_sync.inc
--source include/count_sessions.inc
--disable_query_log
call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* InnoDB redo logging is disabled. All data could be lost in case of a server crash");
call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* InnoDB redo logging is enabled. Data is now safe and can be recovered in case of a server crash.");
--enable_query_log
--let $CLONE_DATADIR = $MYSQL_TMP_DIR/data_new
--let $CLONE_DATADIR2 = $MYSQL_TMP_DIR/data_new2
--let $MYSQLD_DATADIR= `select @@datadir;`
--replace_result $CLONE_PLUGIN CLONE_PLUGIN
--eval INSTALL PLUGIN clone SONAME '$CLONE_PLUGIN'
--echo # 1. CLONE blocked by DDL at beginning
--connect (con1,localhost,root,,)
--echo # In connection CON1
SET DEBUG_SYNC = 'fil_ibd_created_space SIGNAL start_clone WAIT_FOR resume_ddl_1';
--send CREATE TABLE t1(col1 int)
--connection default
--echo # In connection DEFAULT
--let $CON_ID= `SELECT CONNECTION_ID()`
SET DEBUG_SYNC = 'now WAIT_FOR start_clone';
SET DEBUG_SYNC = 'clone_begin_wait_ddl SIGNAL start_ddl_1 WAIT_FOR resume_clone_1';
SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_ddl_2 WAIT_FOR resume_clone_2';
--source ../include/clone_command_send.inc
--connect (con2,localhost,root,,)
--echo # In connection CON2
SET DEBUG_SYNC = 'now WAIT_FOR start_ddl_1';
SET DEBUG_SYNC = 'clone_notify_ddl_before_state_block SIGNAL resume_ddl_1';
--send CREATE TABLE t2(col1 int)
--connection con1
--echo # In connection CON1
--echo # Reap CREATE TABLE t1
--reap
SET DEBUG_SYNC= 'now SIGNAL resume_clone_1';
--connection con2
--echo # In connection CON2
--echo # Reap CREATE TABLE t2
--reap
--echo # Disconnect CON2
--disconnect con2
--connection con1
--echo # In connection CON1
SET DEBUG_SYNC = 'now WAIT_FOR start_ddl_2';
--echo # 1A. TOO MANY CLONE IN PROGRESS
--let $CLONE_DATADIR = $CLONE_DATADIR2
--let $clone_err = ER_CLONE_TOO_MANY_CONCURRENT_CLONES
--source ../include/clone_command.inc
--let $clone_err = 0
--let $CLONE_DATADIR = $MYSQL_TMP_DIR/data_new
--echo # 2. ALTER INSTANCE while clone in progress
--error ER_CLONE_IN_PROGRESS
ALTER INSTANCE DISABLE INNODB REDO_LOG;
INSERT INTO t1 values(10), (20), (30);
SELECT * FROM t1 ORDER BY col1;
--echo # 3. ALTER DISCARD while clone in progress
--error ER_CLONE_IN_PROGRESS
ALTER TABLE t1 DISCARD TABLESPACE;
--echo # 4. ALTER IMPORT while clone in progress
--error ER_CLONE_IN_PROGRESS
ALTER TABLE t1 IMPORT TABLESPACE;
--echo # 5. KILL CLONE command while in progress
--replace_result $CON_ID CON_ID
--eval KILL QUERY $CON_ID
SET DEBUG_SYNC= 'now SIGNAL resume_clone_2';
connection default;
--echo # In connection DEFAULT
--error ER_QUERY_INTERRUPTED
--reap
--force-rmdir $CLONE_DATADIR
SET DEBUG_SYNC = 'RESET';
DROP TABLE t2;
--echo # 6. Force clone to abort by DDL
SET GLOBAL DEBUG = '+d,clone_ddl_error_abort';
SET DEBUG_SYNC = 'clone_file_copy SIGNAL start_ddl WAIT_FOR resume_clone';
--source ../include/clone_command_send.inc
--connection con1
--echo # In connection CON1
SET DEBUG_SYNC = 'now WAIT_FOR start_ddl';
SET DEBUG_SYNC = 'clone_notify_ddl_before_state_block SIGNAL resume_clone';
CREATE TABLE t2(col1 int);
INSERT INTO t2 VALUES(10), (20), (30);
SELECT * FROM t2 ORDER BY col1;
connection default;
--echo # In connection DEFAULT
--error ER_CLONE_DDL_IN_PROGRESS
--reap
SET GLOBAL DEBUG = '-d,clone_ddl_error_abort';
--force-rmdir $CLONE_DATADIR
SET DEBUG_SYNC = 'RESET';
--echo #Cleanup
DROP TABLE t1;
DROP TABLE t2;
connection default;
--echo # In connection DEFAULT
disconnect con1;
SET DEBUG_SYNC = 'RESET';
--echo # Attempt to uninstall clone if there
--error 0, ER_PLUGIN_CANNOT_BE_UNINSTALLED
UNINSTALL PLUGIN clone;
--echo # Restart server
--source include/wait_until_count_sessions.inc
--source include/restart_mysqld.inc
--echo # Uninstall clone if there
--error 0, ER_SP_DOES_NOT_EXIST
UNINSTALL PLUGIN clone;
|