mariadb/mysql-test/suite/galera/t/galera_concurrent_ctas.test
Jan Lindström e913f4e11e MDEV-32024 : Galera library 26.4.16 fails with every server version
Problem was that total order isolation (TOI) is started before
we know sequence implementing storage engine. This led to
situation where table implementing persistent storate
for sequence in case of MyISAM was created on applier causing
errors later in test execution.

Therefore, in both CREATE SEQUENCE and ALTER TABLE to implementing
persistent storage we need to check implementing storage engine
after open_tables and this check must be done in both master
and applier, because if implementing storage engine is MyISAM
it does not support rollback.

Added tests to make sure that if sequence implementing storage
engine is MyISAM or we try to alter it to MyISAM user gets error
and changes are not replicated.

Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
2023-10-21 10:11:16 +02:00

86 lines
2.3 KiB
Text

--source include/galera_cluster.inc
--source include/big_test.inc
--source include/have_debug_sync.inc
#
# To have real concurrent CTAS this test uses DEBUG_SYNC
#
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
--connection node_1
#
# Send CTAS it will block before open_tables call
#
SET DEBUG_SYNC = 'wsrep_create_table_as_select WAIT_FOR continue';
--send CREATE table t1 as SELECT SLEEP(0.1);
--connection node_1a
#
# Wait for CTAS to block
#
--echo # Wait until CTAS is on debug sync point
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: wsrep_create_table_as_select'
--source include/wait_condition.inc
--connection node_1b
#
# Block node_1 applier
#
SET SESSION wsrep_sync_wait = 0;
SET GLOBAL debug_dbug = '+d,sync.wsrep_apply_cb';
#
# Send concurrent CTAS it will block on applier
#
--connection node_2
--send CREATE table t1 as SELECT SLEEP(0.2);
#
# Wait until second CTAS is blocked
#
--connection node_1b
SET SESSION debug_sync = 'now WAIT_FOR sync.wsrep_apply_cb_reached';
--echo # Signal first CTAS to continue and wait until CTAS has executed
SET DEBUG_SYNC= 'now SIGNAL continue';
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'Creating table CREATE table t1 as SELECT SLEEP(0.1)'
--source include/wait_condition.inc
#
# Release second CTAS and cleanup
#
SET GLOBAL debug_dbug= '';
SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb';
#
# Wait until second CTAS continues
#
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'debug sync point: now%'
--source include/wait_condition.inc
#
# Wait until second CTAS finishes
#
--connection node_2a
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'Creating table CREATE table t1 as SELECT SLEEP(0.2)'
--source include/wait_condition.inc
#
# Cleanup
#
--connection node_1b
SET DEBUG_SYNC= 'RESET';
#
# Verify that at least one is successful
#
--connection node_2
--reap
--connection node_1
--error 0,ER_TABLE_EXISTS_ERROR,ER_QUERY_INTERRUPTED
--reap
DROP TABLE t1;
--source include/galera_end.inc
--echo # End of test