106 lines
3.2 KiB
Plaintext
106 lines
3.2 KiB
Plaintext
# Scenario:
|
|
# SigCon connects to slave and creates some lock on a record,
|
|
# and tries to commit, but pauses just before a check for is_aborted.
|
|
# Master changes the same record
|
|
# Applier thread (which is boosted to High Priority) tries to modify
|
|
# the same row Master has modified, but observes the lock created by
|
|
# SigCon, and decides to abort SigCon.
|
|
# SigCon becomes unpaused, notices it should abort.
|
|
# There was a bug in that SigCon client observed success, despite
|
|
# the transaction being aborted.
|
|
|
|
# no need to rerun this test three times
|
|
--source include/have_binlog_format_mixed.inc
|
|
|
|
--source include/have_debug.inc
|
|
--source include/have_debug_sync.inc
|
|
--source include/master-slave.inc
|
|
|
|
--source include/rpl_connection_slave.inc
|
|
SET GLOBAL DEBUG="+d,dbug_set_high_prio_sql_thread";
|
|
|
|
# now applier thread starts with high prio
|
|
# since we are now setting the internal flag
|
|
--source include/stop_slave_sql.inc
|
|
--source include/start_slave_sql.inc
|
|
|
|
--source include/rpl_connection_master.inc
|
|
|
|
####### MASTER #######
|
|
CREATE TABLE t1 (c1 INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES (0);
|
|
|
|
####### SIGCON #######
|
|
--let $rpl_connection_name= sigcon
|
|
--let $rpl_server_number= 2
|
|
--source include/rpl_connect.inc
|
|
|
|
--echo [connection sigcon]
|
|
--let $sync_slave_connection= sigcon
|
|
--source include/sync_slave_sql_with_master.inc
|
|
|
|
|
|
BEGIN;
|
|
SELECT c1 FROM t1 WHERE c1=0 FOR UPDATE;
|
|
SET DEBUG_SYNC='trx_commit_for_mysql_checks_for_aborted WAIT_FOR waiting1';
|
|
--send COMMIT
|
|
|
|
####### SLAVE #######
|
|
--source include/rpl_connection_slave.inc
|
|
# Wait until sigcon reaches the ha_innobase_update_row_done debug sync point.
|
|
--let $wait_condition=SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE State = 'debug sync point: trx_commit_for_mysql_checks_for_aborted'
|
|
--source include/wait_condition.inc
|
|
|
|
####### MASTER #######
|
|
--source include/rpl_connection_master.inc
|
|
UPDATE t1 SET c1=1 WHERE c1=0;
|
|
|
|
####### SLAVE #######
|
|
--source include/rpl_connection_slave.inc
|
|
--sleep 3
|
|
# Now signal the waiting thread on sigcon to resume
|
|
# and it should end up in an error stating that it
|
|
# was aborted
|
|
SET DEBUG_SYNC='now SIGNAL waiting1';
|
|
# Wait for c1 in t1 to be 1
|
|
--let $wait_condition=SELECT COUNT(*)=1 FROM t1 WHERE c1=1
|
|
--source include/wait_condition.inc
|
|
|
|
|
|
####### SIGCON #######
|
|
--echo [connection sigcon]
|
|
--let $rpl_connection_name= sigcon
|
|
--source include/rpl_connection.inc
|
|
--reap
|
|
|
|
--disconnect sigcon
|
|
|
|
####### SLAVE #######
|
|
--connection master
|
|
--let $sync_slave_connection= slave
|
|
--source include/sync_slave_sql_with_master.inc
|
|
|
|
--let $assert_text= 'There is a 1 in t1'
|
|
--let $assert_cond= [SELECT COUNT(*) AS count FROM t1 WHERE t1.c1 = 1, count, 1] = 1
|
|
--source include/assert.inc
|
|
|
|
--let $assert_text= 'There is no 0 in t1'
|
|
--let $assert_cond= [SELECT COUNT(*) AS count FROM t1 WHERE t1.c1 = 0, count, 1] = 0
|
|
--source include/assert.inc
|
|
|
|
--let $assert_text= 'There is no 99 in t1'
|
|
--let $assert_cond= [SELECT COUNT(*) AS count FROM t1 WHERE t1.c1 = 99, count, 1] = 0
|
|
--source include/assert.inc
|
|
|
|
# Clean up.
|
|
--connection master
|
|
DROP TABLE t1;
|
|
--source include/sync_slave_sql_with_master.inc
|
|
|
|
# resetting the applier thread
|
|
--source include/stop_slave_sql.inc
|
|
SET GLOBAL DEBUG="-d,dbug_set_high_prio_sql_thread";
|
|
--source include/start_slave_sql.inc
|
|
|
|
--source include/rpl_end.inc
|