mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 10:56:12 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			232 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| --source include/galera_cluster.inc
 | |
| --source include/have_innodb.inc
 | |
| 
 | |
| #
 | |
| # Test case 1: Start a transaction on node_2a and kill it
 | |
| # from other connection on same node
 | |
| #
 | |
| 
 | |
| --connection node_2
 | |
| call mtr.add_suppression("InnoDB: Transaction was aborted due to ");
 | |
| CREATE TABLE t1(a int not null primary key auto_increment,b int) engine=InnoDB;
 | |
| insert into t1 values (NULL,1);
 | |
| 
 | |
| --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| --connection node_2a
 | |
| call mtr.add_suppression("InnoDB: Transaction was aborted due to ");
 | |
| begin;
 | |
| update t1 set a = 5;
 | |
| 
 | |
| --connection node_2
 | |
| 
 | |
| --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1
 | |
| --source include/wait_condition.inc
 | |
| 
 | |
| --let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1`
 | |
| 
 | |
| --disable_query_log
 | |
| --eval KILL $k_thread
 | |
| --enable_query_log
 | |
| 
 | |
| select * from t1;
 | |
| --disconnect node_2a
 | |
| 
 | |
| #
 | |
| # Test case 2: Start a transaction on node_2a and use
 | |
| # kill query from other connection on same node
 | |
| #
 | |
| 
 | |
| --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| --connection node_2a
 | |
| begin;
 | |
| update t1 set a =5;
 | |
| 
 | |
| --connection node_2
 | |
| --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1
 | |
| --source include/wait_condition.inc
 | |
| 
 | |
| --let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1`
 | |
| 
 | |
| --disable_query_log
 | |
| --eval KILL QUERY $k_thread
 | |
| --enable_query_log
 | |
| 
 | |
| select * from t1;
 | |
| --disconnect node_2a
 | |
| #
 | |
| # Test case 3: Start a transaction on node_2a and start a DDL on other transaction
 | |
| # that will then abort node_2a transaction
 | |
| #
 | |
| --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| --connection node_2a
 | |
| begin;
 | |
| update t1 set a =5, b=2;
 | |
| 
 | |
| --connection node_2
 | |
| ALTER TABLE t1 ADD UNIQUE KEY b1(b);
 | |
| ALTER TABLE t1 DROP KEY b1;
 | |
| 
 | |
| select * from t1;
 | |
| 
 | |
| --disconnect node_2a
 | |
| 
 | |
| #
 | |
| # Test case 4: Start a transaction on node_2a and conflicting transaction on node_2b
 | |
| # and start a DDL on other transaction that will then abort node_2a and node_2b
 | |
| # transactions
 | |
| #
 | |
| 
 | |
| --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| --connection node_2a
 | |
| begin;
 | |
| update t1 set a =5, b=2;
 | |
| 
 | |
| --connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| --connection node_2b
 | |
| begin;
 | |
| send update t1 set a =6, b=7;
 | |
| 
 | |
| --connection node_2
 | |
| ALTER TABLE t1 ADD UNIQUE KEY b2(b);
 | |
| ALTER TABLE t1 DROP KEY b2;
 | |
| 
 | |
| select * from t1;
 | |
| 
 | |
| --disconnect node_2a
 | |
| --disconnect node_2b
 | |
| 
 | |
| #
 | |
| # Test case 5: Start a transaction on node_2a with wsrep disabled.
 | |
| # A conflicting DDL on other transaction can't BF abort
 | |
| # transaction from node_2a (wsrep disabled).
 | |
| #
 | |
| 
 | |
| --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| --connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| --connection node_2a
 | |
| SET SESSION wsrep_on=OFF;
 | |
| begin;
 | |
| update t1 set a =5, b=2;
 | |
| 
 | |
| --connection node_2
 | |
| --send ALTER TABLE t1 ADD UNIQUE KEY b3(b)
 | |
| 
 | |
| --connection node_2b
 | |
| SET SESSION wsrep_sync_wait=0;
 | |
| --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for table metadata lock%' OR STATE LIKE 'Waiting to execute in isolation%';
 | |
| --source include/wait_condition.inc
 | |
| 
 | |
| --connection node_2a
 | |
| select * from t1;
 | |
| 
 | |
| # We expect that ALTER should not be able to BF abort
 | |
| # this transaction, it must wait for it to finish.
 | |
| # Expect commit to succeed.
 | |
| commit;
 | |
| 
 | |
| --connection node_2
 | |
| --reap
 | |
| 
 | |
| --disconnect node_2a
 | |
| --disconnect node_2b
 | |
| 
 | |
| #
 | |
| # Test case 6: Start a transaction on node_2a with wsrep disabled
 | |
| # and kill it from other connection on same node.
 | |
| #
 | |
| 
 | |
| --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| --connection node_2a
 | |
| SET SESSION wsrep_on=OFF;
 | |
| begin;
 | |
| update t1 set a =5, b=2;
 | |
| 
 | |
| --connection node_2
 | |
| --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1
 | |
| --source include/wait_condition.inc
 | |
| 
 | |
| --let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1`
 | |
| 
 | |
| --disable_query_log
 | |
| --eval KILL $k_thread
 | |
| --enable_query_log
 | |
| 
 | |
| select * from t1;
 | |
| 
 | |
| --disconnect node_2a
 | |
| 
 | |
| --connection node_1
 | |
| 
 | |
| source include/maybe_debug.inc;
 | |
| if ($have_debug) {
 | |
| #
 | |
| # Test case 7: Start a transaction on node_2 and use KILL to abort
 | |
| # a query in connection node_2a
 | |
| # During the KILL execution replicate conflicting transaction from node_1
 | |
| # to BF abort the transaction executing the KILL
 | |
| #
 | |
| 
 | |
| --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| --connection node_2a
 | |
| truncate t1;
 | |
| insert into t1 values (7,0);
 | |
| 
 | |
| --connection node_2
 | |
| set wsrep_sync_wait=0;
 | |
| 
 | |
| # get the ID of connection to be later killed
 | |
| --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1
 | |
| --source include/wait_condition.inc
 | |
| --let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1`
 | |
| 
 | |
| # start a transaction
 | |
| begin;
 | |
| update t1 set b=2 where a=7;
 | |
| 
 | |
| # set sync point for incoming applying
 | |
| --connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2
 | |
| set wsrep_sync_wait=0;
 | |
| 
 | |
| SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb";
 | |
| 
 | |
| # replicate conflicting transaction, should stop in the sync point
 | |
| --connection node_1
 | |
| update t1 set b=1 where a=7;
 | |
| 
 | |
| # wait for the applier to reach the sync point
 | |
| --connection node_2b
 | |
| SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached";
 | |
| 
 | |
| # issue KILL inside the transaction, implicit commit is expected
 | |
| --connection node_2
 | |
| --disable_query_log
 | |
| --send_eval KILL QUERY $k_thread
 | |
| --enable_query_log
 | |
| 
 | |
| # wait for the KILL processing to be seen in processlist
 | |
| --connection node_2b
 | |
| --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND INFO LIKE 'KILL QUERY%'
 | |
| --source include/wait_condition.inc
 | |
| 
 | |
| # resume applying, BF abort should follow
 | |
| SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
 | |
| 
 | |
| --connection node_2
 | |
| --error ER_LOCK_DEADLOCK
 | |
| --reap
 | |
| 
 | |
| commit;
 | |
| 
 | |
| select * from t1;
 | |
| 
 | |
| --connection node_2a
 | |
| SET DEBUG_SYNC= 'RESET';
 | |
| SET GLOBAL debug_dbug = "";
 | |
| 
 | |
| --disconnect node_2a
 | |
| --disconnect node_2b
 | |
| 
 | |
| --connection node_1
 | |
| }
 | |
| 
 | |
| drop table t1;
 | 
