Current Path : /usr/opt/mysql57/mysql-test/suite/group_replication/t/ |
FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64 |
Current File : //usr/opt/mysql57/mysql-test/suite/group_replication/t/gr_repeatable_read_isolation.test |
################################################################################ # The aim of the testcase is to test GR with 'REPEATABLE-READ' isolation level # # Test: # 0. Start 2 servers with GR # 1. Set isolation level to 'REPEATABLE-READ' on both server1, server2 # 2. Create a table (t1), Insert some data # 3. Check the negative scenarios with conflicting transaction, # 3.1 set a debug sync and execute a transaction (T1) on server_1 so that it # is blocked before broadcast. # 3.2 check that changes made in connection server_1 has not propogated and # wait until server1 reaches the debug sync point. # 3.3 execute a conflicting transaction (T2) on server2 that will reach # certification first. # 3.4 Signal the waiting thread on server1 to resume. # 3.5 Check the error on server1, it will rollback T1 as it is conflicting # with T2. # Another conflicting transaction, but transaction will rollback # 3.6 ROLL BACK a transaction on server1 # 3.7 Execute a transaction on server2 # 3.8 Transaction originated on server2 will be successful as ROLLED BACK # transactions are not broadcasted. # 4. Check the positive scenarios with non-conflicting transaction, # 4.1 set a debug sync and execute a transaction (T1) on server_1 so that it # is blocked before broadcast. # 4.2 wait until server1 reaches the debug sync point. # 4.3 execute a non-conflicting transaction (T2) on server2 that will reach # certification first. # 4.4 Signal the waiting thread on server1 to resume. # 4.5 Check that both T1 and T2 are executed successfully. # 5. Validate that server1, server2 has same set of data and assert that number # of negatively certified quries are expected ones. # 6. clean-up ################################################################################ --source include/big_test.inc --source include/have_debug_sync.inc --source ../inc/have_group_replication_plugin.inc --source ../inc/group_replication.inc --echo --echo ## 1. Set global isolation level to 'REPEATABLE-READ' on server1, server2 --let $rpl_connection_name= server1 --source include/rpl_connection.inc # Store default isolation level SET @transaction_isolation_global_orig = @@global.transaction_isolation; SET GLOBAL transaction_isolation= 'REPEATABLE-READ'; SET @transaction_isolation_session_orig = @@global.transaction_isolation; SET SESSION transaction_isolation= 'REPEATABLE-READ'; --let $rpl_connection_name= server2 --source include/rpl_connection.inc SET @transaction_isolation_global_orig = @@global.transaction_isolation; SET GLOBAL transaction_isolation= 'REPEATABLE-READ'; SET @transaction_isolation_session_orig = @@global.transaction_isolation; SET SESSION transaction_isolation= 'REPEATABLE-READ'; --echo --echo ## 2. Create table and insert some data --let $rpl_connection_name= server1 --source include/rpl_connection.inc CREATE TABLE t1 (a INT PRIMARY KEY); INSERT INTO t1 VALUES (10),(20); --source include/rpl_sync.inc --echo --echo ## 3.1 Set a debug sync before broadcast message to group on server1 --echo ## Commit a transaction that will be blocked before broadcast. --let $rpl_connection_name= server_1 --source include/rpl_connection.inc SET @debug_save= @@GLOBAL.DEBUG; SET @@GLOBAL.DEBUG='d,group_replication_before_message_broadcast'; BEGIN; UPDATE t1 set a= 1 where a= 10; --send COMMIT --echo --echo ## 3.2 Wait until server_1 connection reaches the --echo ## 'group_replication_before_message_broadcast' debug sync point. --let $rpl_connection_name= server1 --source include/rpl_connection.inc # Assert that data on t1 remain unchanged --let $assert_text= 'Table t1 should contain a row with a=10' --let $assert_cond= [SELECT COUNT(*) AS count FROM t1 where t1.a= 10, count, 1]= 1 --source include/assert.inc --let $assert_text= 'Table t1 should contain a row with a=20' --let $assert_cond= [SELECT COUNT(*) AS count FROM t1 where t1.a= 20, count, 1]= 1 --source include/assert.inc --let $wait_condition=SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE State = 'debug sync point: now' --source include/wait_condition.inc --echo --echo ## 3.3. Execute a transaction on server2, that will reach first --echo ## certification, since server_1 is blocked before broadcast. --let $rpl_connection_name= server2 --source include/rpl_connection.inc BEGIN; UPDATE t1 SET a=3 WHERE a=10; DELETE FROM t1 where a=20; COMMIT; --echo --echo ## 3.4 Signal the waiting thread on server1 to resume. --let $rpl_connection_name= server1 --source include/rpl_connection.inc SET DEBUG_SYNC='now SIGNAL waiting'; SET @@GLOBAL.DEBUG= @debug_save; --echo --echo ## 3.5 It will end up in an error stating that it was aborted, since --echo ## transactions are conflicting and server2 was ordered first. --let $rpl_connection_name= server2 --source include/rpl_connection.inc --let $sync_slave_connection= server1 --source include/sync_slave_sql_with_master.inc --let $rpl_connection_name= server_1 --source include/rpl_connection.inc --error ER_TRANSACTION_ROLLBACK_DURING_COMMIT --reap --echo --echo ## 3.6 ROLL BACK a transaction on server1 --let $rpl_connection_name= server_1 --source include/rpl_connection.inc BEGIN; UPDATE t1 set a= 30 where a= 3; --send ROLLBACK --echo --echo ## 3.7 Execute a transaction on server2 --let $rpl_connection_name= server2 --source include/rpl_connection.inc BEGIN; UPDATE t1 SET a=10 WHERE a=3; COMMIT; --let $sync_slave_connection= server1 --source include/sync_slave_sql_with_master.inc --echo --echo ## 3.8 Transaction originated on server2 will be successful as ROLLED BACK --echo ## transactions are not broadcasted. --let $rpl_connection_name= server_1 --source include/rpl_connection.inc --reap --echo ## Validating data on server1 and server2 --let $rpl_connection_name= server1 --source include/rpl_connection.inc --let $assert_text= 'Table t1 has a row with a=10' --let $assert_cond= "[SELECT COUNT(*) AS count FROM t1 WHERE t1.a = 10, count, 1]" = "1" --source include/assert.inc --let $assert_text= 'Table t1 will contain 1 row after the above execution' --let $assert_cond= "[SELECT COUNT(*) AS count FROM t1, count, 1]" = "1" --source include/assert.inc # Check that t1 on Server1, Server2 has same data --let $diff_tables= server1:test.t1, server2:test.t1 --source include/diff_tables.inc --echo --echo ## Checking the positive case in which there is no conflict. --echo --echo ## 4.1 Commit a transaction that will be block before broadcast. --echo ## Set a debug sync before broadcast message to group on server1 --let $rpl_connection_name= server_1 --source include/rpl_connection.inc SELECT * FROM t1; SET @@GLOBAL.DEBUG='d,group_replication_before_message_broadcast'; BEGIN; INSERT INTO t1 VALUES (2); --send COMMIT --echo --echo ## 4.2 Wait until server_1 connection reaches the --echo ## group_replication_before_message_broadcast debug sync point. --let $rpl_connection_name= server1 --source include/rpl_connection.inc --let $wait_condition=SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE State = 'debug sync point: now' --source include/wait_condition.inc --echo --echo ## 4.3 Execute a non-conflicting transaction on server2, that will reach --echo ## first certification, since server_1 is blocked before broadcast. --let $rpl_connection_name= server2 --source include/rpl_connection.inc UPDATE t1 SET a=1 where a=10; --let $sync_slave_connection= server1 --source include/sync_slave_sql_with_master.inc --echo --echo ## 4.4 Signal the waiting thread on server_1 to resume. --let $rpl_connection_name= server1 --source include/rpl_connection.inc SET DEBUG_SYNC='now SIGNAL waiting'; SET DEBUG_SYNC= 'RESET'; SET @@GLOBAL.DEBUG= @debug_save; --echo --echo ## 4.5 Transaction will be executed --let $rpl_connection_name= server_1 --source include/rpl_connection.inc --reap --source include/rpl_sync.inc --echo --echo ## 5. Assert that number of certified transactions are the --echo ## expected ones. --let $rpl_connection_name= server1 --source include/rpl_connection.inc --let $assert_text= 'Table t1 should contain a row with a=1' --let $assert_cond= "[SELECT COUNT(*) AS count FROM t1 WHERE t1.a = 1, count, 1]" = "1" --source include/assert.inc --let $assert_text= 'Table t1 should contain a row with a=2' --let $assert_cond= "[SELECT COUNT(*) AS count FROM t1 WHERE t1.a = 2, count, 1]" = "1" --source include/assert.inc --let $assert_text= 'Table t1 will contain 2 rows after the above execution' --let $assert_cond= "[SELECT COUNT(*) AS count FROM t1, count, 1]" = "2" --source include/assert.inc --let $assert_text= 'The value of Count_Transactions_Checked should be 7 after starting group replication' --let $assert_cond= "[SELECT Count_Transactions_Checked from performance_schema.replication_group_member_stats where member_id in (SELECT @@server_uuid), Count_Transactions_Checked, 1]" = "7" --source include/assert.inc --let $assert_text= The value of Count_Conflicts_Detected should be 1 after starting group replication --let $assert_cond= "[SELECT Count_Conflicts_Detected from performance_schema.replication_group_member_stats where member_id in (SELECT @@server_uuid), Count_Conflicts_Detected, 1]" = "1" --source include/assert.inc # Check that t1 on Server1, Server2 is same --let $diff_tables= server1:test.t1, server2:test.t1 --source include/diff_tables.inc --echo --echo ## 6. Clean up. # Restore original isolation levels SET GLOBAL transaction_isolation= @transaction_isolation_global_orig; SET SESSION transaction_isolation= @transaction_isolation_session_orig; --let $rpl_connection_name= server2 --source include/rpl_connection.inc SET GLOBAL transaction_isolation= @transaction_isolation_global_orig; SET SESSION transaction_isolation= @transaction_isolation_session_orig; # Drop table DROP TABLE t1; --source ../inc/group_replication_end.inc