############################################################################### # # This test checks if the original_server_version and immediate_server_version # are generated and replicated correctly inside a group. # # 0. The test uses 4 servers in a setup that includes a GR group in multi # primary mode and asynchronous slave connections. # 1. Start two members of the group (server2 and server3). # 2. Execute a transaction on each of these two servers. Server3 will have a # pre-determined server version, set by a debug point- # 3. Synchronize the group and start a third member (server4). # 4. Make the following assertions on the executed transactions: # 4.1. The original_server_version is the same accross all servers and # immediate_server_version is generated correctly. # 4.2. Transactions consisting of view change events have their # original_server_version set to their own server version. # 5. Run transactions on the server outside the group (server1) and synchronize # the group. # 6. Assert that the original_server_version and immediate_server_version of # these transactions generated outside the group are correctly replicated and # generated. # 7. Cleanup. # # ==== References ==== # # WL#11879 replicate original server version --source include/have_debug.inc # needed so that GTIDs are deterministic --source include/have_group_replication_gtid_assignment_block_size_1.inc --source include/have_group_replication_plugin.inc --let $rpl_skip_group_replication_start = 1 --let $rpl_server_count = 4 --let $rpl_multi_source = 1 --source include/group_replication.inc # transform server version in format AA.BB.CC[-suffix] into AABBCC --write_file $MYSQL_TMP_DIR/get_numerical_server_version.inc --let $server_version = `SELECT @@GLOBAL.version` --let $major_version_number = `SELECT SUBSTRING_INDEX('$server_version', '.', 1)` --let $mid_version_number = `SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('$server_version', '.', 2), '.', -1)` --let $minor_version_number = `SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('$server_version', '-', 1), '.', -1)` --let $numerical_server_version = `SELECT $major_version_number * 10000 + $mid_version_number * 100 + $minor_version_number` EOF # start first member of the group --let $rpl_connection_name = server2 --source include/rpl_connection.inc --source include/start_and_bootstrap_group_replication.inc # this group member is also a slave of server1 # (server2 was implicitely set up as slave of server1 in include/group_replication.inc) --source include/start_slave.inc # start second member of the group --let $rpl_connection_name = server3 --source include/rpl_connection.inc --source include/start_group_replication.inc # execute a transaction on server2 --let $rpl_connection_name = server2 --source include/rpl_connection.inc CREATE TABLE t1(a INT PRIMARY KEY); # sync group --let $rpl_connection_name= server2 --source include/rpl_connection.inc --let $sync_slave_connection= server3 --source include/sync_slave_sql_with_master.inc # execute a transaction on server3, forcing its original_server_version to be # 777777 in order to check that the value is replicated unchanged. Also force # immediate_server_version to be 777777 to check that it is generated correctly --let $rpl_connection_name = server3 --source include/rpl_connection.inc --let $debug_point = gr_fixed_server_version --source include/add_debug_point.inc DROP TABLE t1; # sync group --let $rpl_connection_name= server2 --source include/rpl_connection.inc --let $sync_slave_connection= server3 --source include/sync_slave_sql_with_master.inc # start third member of the group (which will be synced with the group as it joins) --let $rpl_connection_name = server4 --source include/rpl_connection.inc --source include/start_group_replication.inc # check if the original_server_version from the CREATE TABLE transaction from # server2 was propagated correctly, immediate_server_version was generated # correctly and that the immediate_server_version was replicated correctly to # server3 through the GR applier channel. --let $gtid = $group_replication_group_name:3 --let $rpl_connection_name = server2 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_2 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_2 = $immediate_server_version --source $MYSQL_TMP_DIR/get_numerical_server_version.inc --let $numerical_server_version_2 = $numerical_server_version --let $rpl_connection_name = server3 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_3 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_3 = $immediate_server_version --let $log_file = $server_3_datadir/server-relay-log-group_replication_applier.000002 --source include/get_immediate_server_version.inc --let $relay_log_ISV_3 = $immediate_server_version --source $MYSQL_TMP_DIR/get_numerical_server_version.inc --let $numerical_server_version_3 = $numerical_server_version --let $rpl_connection_name = server4 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_4 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_4 = $immediate_server_version --source $MYSQL_TMP_DIR/get_numerical_server_version.inc --let $numerical_server_version_4 = $numerical_server_version --let $assert_text = server2 original_server_version must be equal to its own server version --let $assert_cond = $numerical_server_version_2 = $OSV_2 --source include/assert.inc --let $assert_text = server3 original_server_version must be equal to server2 --let $assert_cond = $OSV_3 = $OSV_2 --source include/assert.inc --let $assert_text = server4 original_server_version must be equal to server2 --let $assert_cond = $OSV_4 = $OSV_2 --source include/assert.inc --let $assert_text = server2 immediate_server_version must be equal its own server version --let $assert_cond = $ISV_2 = $numerical_server_version_2 --source include/assert.inc --let $assert_text = server3 immediate_server_version must be equal its own server version --let $assert_cond = $ISV_3 = $numerical_server_version_3 --source include/assert.inc --let $assert_text = server4 immediate_server_version must be equal its own server version --let $assert_cond = $ISV_4 = $numerical_server_version_4 --source include/assert.inc --let $assert_text = server3 immediate_server_version in the applier relay log must be equal to server2 ISV --let $assert_cond = $relay_log_ISV_3 = $ISV_2 --source include/assert.inc # check if the original_server_version from the DROP TABLE transaction from # server3 was propagated correctly and if immediate_server_version was generated # correctly --let $gtid = $group_replication_group_name:4 --let $rpl_connection_name = server2 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_2 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_2 = $immediate_server_version --let $rpl_connection_name = server3 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_3 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_3 = $immediate_server_version --let $rpl_connection_name = server4 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_4 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_4 = $immediate_server_version --let $assert_text = server3 original_server_version must be equal to 777777 --let $assert_cond = $OSV_3 = 777777 --source include/assert.inc --let $assert_text = server2 original_server_version must be equal to server3 --let $assert_cond = $OSV_2 = $OSV_3 --source include/assert.inc --let $assert_text = server4 original_server_version must be equal to server3 --let $assert_cond = $OSV_4 = $OSV_3 --source include/assert.inc --let $assert_text = server2 immediate_server_version must be equal to its own server version --let $assert_cond = $ISV_2 = $numerical_server_version_2 --source include/assert.inc --let $assert_text = server3 immediate_server_version must be equal to 777777 --let $assert_cond = $ISV_3 = 777777 --source include/assert.inc --let $assert_text = server4 immediate_server_version must be equal to its own server version --let $assert_cond = $ISV_4 = $numerical_server_version_4 --source include/assert.inc # check the View_change log event generated when server 4 joined --let $gtid = $group_replication_group_name:1 --let $rpl_connection_name = server2 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_2 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_2 = $immediate_server_version --let $rpl_connection_name = server3 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_3 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_3 = $immediate_server_version --let $rpl_connection_name = server4 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_4 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_4 = $immediate_server_version --let $assert_text = server2 original_server_version must be equal to its own server_version --let $assert_cond = $OSV_2 = $numerical_server_version_2 --source include/assert.inc --let $assert_text = server3 original_server_version must be equal to its own server_version --let $assert_cond = $OSV_3 = $numerical_server_version_3 --source include/assert.inc --let $assert_text = server4 original_server_version must be equal to its own server_version --let $assert_cond = $OSV_4 = $numerical_server_version_4 --source include/assert.inc --let $assert_text = server2 immediate_server_version must be equal to its own server_version --let $assert_cond = $ISV_2 = $numerical_server_version_2 --source include/assert.inc --let $assert_text = server3 immediate_server_version must be equal to its own server_version --let $assert_cond = $ISV_3 = $numerical_server_version_3 --source include/assert.inc --let $assert_text = server4 immediate_server_version must be equal to its own server_version --let $assert_cond = $ISV_4 = $numerical_server_version_4 --source include/assert.inc # run transactions on server1 --let $rpl_connection_name = server1 --source include/rpl_connection.inc # force transactions issued by this server to have 888888 has server version --let $debug_point = fixed_server_version --source include/add_debug_point.inc --let $server1_uuid = query_get_value(select @@global.server_uuid, @@global.server_uuid, 1) CREATE TABLE t2 (a INT PRIMARY KEY); DROP TABLE t2; # sync server2 with its master, server1 --let $sync_slave_connection = server2 --source include/sync_slave_sql_with_master.inc --let $sync_slave_connection = # sync group --let $rpl_connection_name= server2 --source include/rpl_connection.inc --let $sync_slave_connection= server3 --source include/sync_slave_sql_with_master.inc --let $rpl_connection_name= server2 --source include/rpl_connection.inc --let $sync_slave_connection= server4 --source include/sync_slave_sql_with_master.inc # check if transactions from outside the group have the expected # original_server_version and immediate_server_version --let $gtid = $server1_uuid:1 --let $rpl_connection_name = server1 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_1 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_1 = $immediate_server_version --let $rpl_connection_name = server2 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_2 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_2 = $immediate_server_version --let $rpl_connection_name = server3 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_3 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_3 = $immediate_server_version --let $rpl_connection_name = server4 --source include/rpl_connection.inc --source include/get_original_server_version.inc --let $OSV_4 = $original_server_version --source include/get_immediate_server_version.inc --let $ISV_4 = $immediate_server_version --let $assert_text = server1 original_server_version must be equal to 888888 --let $assert_cond = $OSV_1 = 888888 --source include/assert.inc --let $assert_text = server2 original_server_version must be equal to server1 --let $assert_cond = $OSV_2 = $OSV_1 --source include/assert.inc --let $assert_text = server3 original_server_version must be equal to server1 --let $assert_cond = $OSV_3 = $OSV_1 --source include/assert.inc --let $assert_text = server4 original_server_version must be equal to server1 --let $assert_cond = $OSV_4 = $OSV_1 --source include/assert.inc --let $assert_text = server1 immediate_server_version must be equal to 888888 --let $assert_cond = $ISV_1 = 888888 --source include/assert.inc --let $assert_text = server2 immediate_server_version must be equal to its own server version --let $assert_cond = $ISV_2 = $numerical_server_version_2 --source include/assert.inc # the debug point has not been removed yet, which means that the immediate # server version must still be 777777 --let $assert_text = server3 immediate_server_version must be equal to 777777 --let $assert_cond = $ISV_3 = 777777 --source include/assert.inc --let $assert_text = server4 immediate_server_version must be equal to its own server version --let $assert_cond = $ISV_4 = $numerical_server_version_4 --source include/assert.inc # cleanup --let $rpl_connection_name = server1 --source include/rpl_connection.inc --let $debug_point = fixed_server_version --source include/remove_debug_point.inc --let $rpl_connection_name = server3 --source include/rpl_connection.inc --let $debug_point = gr_fixed_server_version --source include/remove_debug_point.inc --let $rpl_connection_name= server2 --source include/rpl_connection.inc --let $rpl_channel_name= 'channel_1' --source include/stop_slave.inc --source include/rpl_reset_slave_helper.inc --let $rpl_skip_sync= 1 --source include/group_replication_end.inc --remove_file $MYSQL_TMP_DIR/get_numerical_server_version.inc