# # MDEV-24255 # Test BF abort of a transaction that has ps-protocol enabled # This test stresses the case where wsrep_before_command() # finds the transaction in state s_must_abort. This only # possible when the server is using the thread pool. # --source include/galera_cluster.inc --source include/have_debug_sync.inc CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(6)) ENGINE=InnoDB; --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 --connection node_2 --let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` START TRANSACTION; INSERT INTO t1 VALUES (1,'node_2'); --connection node_2a SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; --connection node_1 INSERT INTO t1 VALUES (1,'node_1'); --connection node_2a SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; --connection node_2 SET DEBUG_SYNC = "wsrep_before_before_command SIGNAL signal.wsrep_apply_cb WAIT_FOR bf_abort"; # # The following INSERT is expected to enter # wsrep_before_command() and find its transaction # in state s_must_abort. # Notice that the test appears more complicated # than it needs to... however we cannot use # --send for this INSERT, otherwise mysqltest # will not use ps-protocol # --error ER_LOCK_DEADLOCK INSERT INTO t1 VALUES (2, 'node_2'); --let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` --disable_query_log --eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; --enable_query_log SET DEBUG_SYNC = 'RESET'; SET GLOBAL debug_dbug = DEFAULT; DROP TABLE t1;