--source include/galera_cluster.inc --source include/have_innodb.inc --source include/have_debug_sync.inc # # Test the following sequence of events: # # 1. Node #1 begins a transaction # 2. Node #2 performs a conflicting insert # 3. Node #1 attempts to SR-replicate a conflicting transaction # # to sync node_1 appliers --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 --connection node_1 CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; SET SESSION wsrep_trx_fragment_size = 2; SET SESSION wsrep_trx_fragment_unit = 'statements'; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; --let $expected_cert_failures = `SELECT VARIABLE_VALUE + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` SET AUTOCOMMIT=OFF; START TRANSACTION; --connection node_1a SET GLOBAL DEBUG_DBUG = 'd,sync.wsrep_apply_cb'; SET SESSION wsrep_sync_wait = 0; --connection node_2 INSERT INTO t1 VALUES (1); --connection node_1a SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; SELECT COUNT(*) = 0 FROM t1; --connection node_1 SELECT COUNT(*) = 0 FROM t1; --send INSERT INTO t1 VALUES (1); --connection node_1a # Wait for the above INSERT to fail certification --connection node_1a --let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' --source include/wait_condition.inc SET GLOBAL DEBUG_DBUG = ''; SET DEBUG_SYNC='now SIGNAL signal.wsrep_apply_cb'; --connection node_1 --error ER_LOCK_DEADLOCK --reap COMMIT; SELECT COUNT(*) = 1 FROM t1; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; --connection node_2 SELECT COUNT(*) = 1 FROM t1; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; --connection node_1a SET DEBUG_SYNC = 'RESET'; # # Similar test with BYTES unit # --connection node_1 TRUNCATE TABLE t1; SET SESSION wsrep_trx_fragment_size = 10; SET SESSION wsrep_trx_fragment_unit = 'bytes'; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; --let $expected_cert_failures = `SELECT VARIABLE_VALUE + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` SET AUTOCOMMIT=OFF; START TRANSACTION; --connection node_1a SET GLOBAL DEBUG_DBUG = 'd,sync.wsrep_apply_cb'; SET SESSION wsrep_sync_wait = 0; --connection node_2 INSERT INTO t1 VALUES (1); --connection node_1a SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; SELECT COUNT(*) = 0 FROM t1; --connection node_1 SELECT COUNT(*) = 0 FROM t1; --send INSERT INTO t1 VALUES (1) # Wait for the above INSERT to fail certification --connection node_1a --let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' --source include/wait_condition.inc SET GLOBAL DEBUG_DBUG = ''; SET DEBUG_SYNC='now SIGNAL signal.wsrep_apply_cb'; --connection node_1 --error ER_LOCK_DEADLOCK --reap ROLLBACK; SELECT * FROM t1; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; --connection node_2 SELECT * FROM t1; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; --connection node_1a SET DEBUG_SYNC = 'RESET'; # # One more test with BYTES unit, but now fragment size is adjusted so # that second insert should trigger fragment replication. # Currently 200 bytes is good choice here, but this may change with # future MySQL versions. # => If this test fails after some MySQL merge, check if frgament size # needs to be tuned to spot at second insert statement. # --connection node_1 TRUNCATE TABLE t1; SET SESSION wsrep_trx_fragment_size = 200; SET SESSION wsrep_trx_fragment_unit = 'bytes'; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; --let $expected_cert_failures = `SELECT VARIABLE_VALUE + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` SET AUTOCOMMIT=OFF; START TRANSACTION; --connection node_1a SET GLOBAL DEBUG_DBUG = 'd,sync.wsrep_apply_cb'; SET SESSION wsrep_sync_wait = 0; --connection node_2 INSERT INTO t1 VALUES (1); --connection node_1a SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; SELECT COUNT(*) = 0 FROM t1; --connection node_1 INSERT INTO t1 VALUES (1); --send INSERT INTO t1 VALUES (2) # Wait for the above INSERT to fail certification --connection node_1a --let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' --source include/wait_condition.inc SET GLOBAL DEBUG_DBUG = ''; SET DEBUG_SYNC='now SIGNAL signal.wsrep_apply_cb'; --connection node_1 --error ER_LOCK_DEADLOCK --reap COMMIT; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; --connection node_2 SELECT COUNT(*) = 1 FROM t1; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; --connection node_1a DROP TABLE t1; SET DEBUG_SYNC = 'RESET'; --connection node_2 CALL mtr.add_suppression("WSREP: Could not find applier context for");