# ==== Purpose ==== # # This test case will test expected blockages when querying # performance_schema.log_status table. # # It will use 6 additional connections to the slave server to # send a statement that is expected to be blocked. Then, it will # proceed with the blockage by using debug instrumentation to # pause the thread generating the result before actually collecting # the log information. # # The test case will send all 6 statements expected to block, and will # wait until all report as doing something in performance_schema.threads. # # Finally, the test case will release the blockage and will wait until all # 6 statements to finish. # # The collected information will be verified. # # ==== Related Bugs and Worklogs ==== # # WL#9452: Log Position Lock # --source include/force_myisam_default.inc --source include/have_myisam.inc --source include/have_debug.inc --source include/have_debug_sync.inc # Test requires master-info-repository=TABLE, relay-log-info-repository=TABLE --source include/have_slave_repository_type_table.inc --let $rpl_extra_connections_per_server= 6 --source include/master-slave.inc # Create a table to store the data to be validated CREATE TABLE ils_copy ( uuid VARCHAR(36) PRIMARY KEY, master JSON NOT NULL, channels JSON NOT NULL, storage_engines JSON NOT NULL); CREATE TABLE t1_innodb (c1 INT); CREATE TABLE t2_myisam (c1 INT) ENGINE=MyISAM; --source include/sync_slave_sql_with_master.inc # Make server to pause when fully blocked --let $debug_point= pause_collecting_instance_logs_info --source include/add_debug_point.inc # Create a new channel, so we can test a non-empty channel name on results CHANGE MASTER TO MASTER_HOST = '127.0.0.1' FOR CHANNEL 'ch1'; # Suppression of error messages CALL mtr.add_suppression('Unsafe statement written to the binary log'); # Save current master binary log coordinates and gtid_executed --let $_saved_gtids= if (`SELECT @@GLOBAL.gtid_mode = "ON"`) { --let $use_gtids= 1 } --source include/save_master_pos.inc # Save current slave relay log coordinates --let $relay_log_file= query_get_value(SHOW SLAVE STATUS, Relay_Log_File, 1) --let $relay_log_pos= query_get_value(SHOW SLAVE STATUS, Relay_Log_Pos, 1) --let $ch1_relay_log_file= query_get_value(SHOW SLAVE STATUS, Relay_Log_File, 2) # As we do not start ch1, we cannot verify its positions accurately for this # test case purposes. That is fine as the objective is to test a non-empty # channel name. --source include/rpl_connection_slave1.inc FLUSH TABLES test.t2_myisam, performance_schema.threads WITH READ LOCK; --source include/rpl_connection_slave.inc # Save current InnoDB LSN and LSN_checkpoint before the collection --replace_regex /\n// /.*Last checkpoint at[[:space:]]*([0-9]+).*/\1/ --let $innodb_seis=`SHOW ENGINE INNODB STATUS` # Remove the "InnoDB" from the collected LSN_checkpoint info --let $innodb_lsn_checkpoint_before=`SELECT LTRIM(RIGHT('$innodb_seis', LENGTH('$innodb_seis') - 6))` --replace_regex /\n// /.*Log sequence number[[:space:]]*([0-9]+).*/\1/ --let $innodb_seis=`SHOW ENGINE INNODB STATUS` # Remove the "InnoDB" from the collected LSN info --let $innodb_lsn_before=`SELECT LTRIM(RIGHT('$innodb_seis', LENGTH('$innodb_seis') - 6))` # Collect the instance log status into ils_copy table --let $ils_dump= $MYSQLTEST_VARDIR/tmp/ils_$server_2_uuid --replace_result $ils_dump ILS_DUMP --send_eval SELECT * FROM performance_schema.log_status INTO OUTFILE '$ils_dump' --source include/rpl_connection_slave1.inc SET DEBUG_SYNC='now WAIT_FOR reached_collecting_instance_logs_info'; # No actions below show progress until # signaling "continue_collecting_instance_logs_info" in DEBUG_SYNC # No changes into binary log --let $rpl_connection_name= server_2_1 --source include/rpl_connection.inc --let $tid1=`SELECT CONNECTION_ID()` --send FLUSH LOCAL BINARY LOGS; # No changes into Gtid_state (GTID_EXECUTED) --let $rpl_connection_name= server_2_2 --source include/rpl_connection.inc --let $tid2=`SELECT CONNECTION_ID()` --send SET @@GLOBAL.gtid_purged = '+00000000-0000-0000-0000-000000000000:1-999' # No new channels can be created --let $rpl_connection_name= server_2_3 --source include/rpl_connection.inc --let $tid3=`SELECT CONNECTION_ID()` --send CHANGE MASTER TO MASTER_HOST='127.0.0.1' FOR CHANNEL 'ch2' # No existing channels can be removed --let $rpl_connection_name= server_2_4 --source include/rpl_connection.inc --let $tid4=`SELECT CONNECTION_ID()` --send RESET SLAVE ALL FOR CHANNEL 'ch1' # No changes into blocked storage engines (InnoDB) --let $rpl_connection_name= server_2_5 --source include/rpl_connection.inc --let $tid5=`SELECT CONNECTION_ID()` SET @sql_log_bin = 0; --send INSERT INTO t1_innodb VALUE (9) # No changes into blocked tables (MyISAM) --let $rpl_connection_name= server_2_6 --source include/rpl_connection.inc --let $tid6=`SELECT CONNECTION_ID()` SET @sql_log_bin = 0; --send INSERT INTO t2_myisam VALUE (9) # No changes into I/O thread relay log positions --source include/rpl_connection_master.inc FLUSH BINARY LOGS; INSERT INTO t1_innodb VALUES (1); INSERT INTO t2_myisam VALUES (1); FLUSH BINARY LOGS; INSERT INTO t1_innodb VALUES (2); INSERT INTO t2_myisam VALUES (2); # Give some time to all "--send" above --sleep 1 --source include/rpl_connection_slave1.inc --echo Wait until all threads expecting to be block be doing something --source include/rpl_connection_slave1.inc let $wait_condition= SELECT COUNT(*) = 6 FROM performance_schema.threads WHERE PROCESSLIST_ID IN ($tid1, $tid2, $tid3, $tid4, $tid5, $tid6) AND PROCESSLIST_STATE IS NOT NULL; --source include/wait_condition_or_abort.inc SET DEBUG_SYNC='now SIGNAL continue_collecting_instance_logs_info'; UNLOCK TABLES; --source include/rpl_connection_slave.inc --reap --replace_result $ils_dump ILS_DUMP --eval LOAD DATA INFILE '$ils_dump' INTO TABLE ils_copy --let $rpl_connection_name= server_2_1 --source include/rpl_connection.inc --reap --let $rpl_connection_name= server_2_2 --source include/rpl_connection.inc --reap --let $rpl_connection_name= server_2_3 --source include/rpl_connection.inc --reap --let $rpl_connection_name= server_2_4 --source include/rpl_connection.inc --reap --let $rpl_connection_name= server_2_5 --source include/rpl_connection.inc --reap --let $rpl_connection_name= server_2_6 --source include/rpl_connection.inc --reap --source include/rpl_connection_slave1.inc --echo Wait until all blocked threads are released and finish let $wait_condition= SELECT COUNT(*) = 6 FROM performance_schema.threads WHERE PROCESSLIST_ID IN ($tid1, $tid2, $tid3, $tid4, $tid5, $tid6) AND PROCESSLIST_STATE IS NULL; --source include/wait_condition_or_abort.inc # # Validate what was collected from performance_schema.log_status table # --source include/rpl_connection_slave.inc if ($rpl_debug) { --query_vertical SELECT * FROM ils_copy } # Save current InnoDB LSN and LSN_checkpoint after the collection --replace_regex /\n// /.*Last checkpoint at[[:space:]]*([0-9]+).*/\1/ --let $innodb_seis=`SHOW ENGINE INNODB STATUS` # Remove the "InnoDB" from the collected LSN_checkpoint info --let $innodb_lsn_checkpoint_after=`SELECT LTRIM(RIGHT('$innodb_seis', LENGTH('$innodb_seis') - 6))` --replace_regex /\n// /.*Log sequence number[[:space:]]*([0-9]+).*/\1/ --let $innodb_seis=`SHOW ENGINE INNODB STATUS` # Remove the "InnoDB" from the collected LSN info --let $innodb_lsn_after=`SELECT LTRIM(RIGHT('$innodb_seis', LENGTH('$innodb_seis') - 6))` --let $assert_text= Collected server UUID is correct --let $ils_uuid= `SELECT uuid FROM ils_copy` --let $assert_cond= "$ils_uuid" = "$server_2_uuid" --source include/assert.inc --let $assert_text= Collected master binary log file name is correct --let $ils_master_file= `SELECT JSON_EXTRACT(master, "$.binary_log_file") FROM ils_copy` --let $assert_cond= $ils_master_file = "$_saved_file" --source include/assert.inc --let $assert_text= Collected master binary log file position is correct --let $ils_master_pos= `SELECT JSON_EXTRACT(master, "$.binary_log_position") FROM ils_copy` --let $assert_cond= $ils_master_pos = $_saved_pos --source include/assert.inc --let $assert_text= Collected master gtid_executed is correct --let $ils_gtid_executed= `SELECT JSON_EXTRACT(master, "$.gtid_executed") FROM ils_copy` --let $assert_cond= $ils_gtid_executed = "$_saved_gtids" --source include/assert.inc --let $assert_text= Collected default replication channel name is correct --let $ils_channel_name= `SELECT JSON_EXTRACT(channels, "$.channels[0].channel_name") FROM ils_copy` --let $assert_cond= $ils_channel_name = "" --source include/assert.inc --let $assert_text= Collected default replication channel relay log file name is correct --let $ils_relay_log_file= `SELECT JSON_EXTRACT(channels, "$.channels[0].relay_log_file") FROM ils_copy` --let $assert_cond= $ils_relay_log_file = "$relay_log_file" --source include/assert.inc --let $assert_text= Collected default replication channel relay log file position is correct --let $ils_relay_log_pos= `SELECT JSON_EXTRACT(channels, "$.channels[0].relay_log_position") FROM ils_copy` --let $assert_cond= $ils_relay_log_pos = $relay_log_pos --source include/assert.inc --let $assert_text= Collected replication channel name for ch1 is correct --let $ils_ch1_channel_name= `SELECT JSON_EXTRACT(channels, "$.channels[1].channel_name") FROM ils_copy` --let $assert_cond= $ils_ch1_channel_name = "ch1" --source include/assert.inc --let $assert_text= Collected replication channel relay log file name for ch1 is correct --let $ils_ch1_relay_log_file= `SELECT JSON_EXTRACT(channels, "$.channels[1].relay_log_file") FROM ils_copy` --let $assert_cond= $ils_ch1_relay_log_file = "$ch1_relay_log_file" --source include/assert.inc --let $assert_text= There is no other channel information collected (no ch2) --let $ils_ch2= `SELECT JSON_EXTRACT(channels, "$.channels[2].channel_name") IS NULL FROM ils_copy` --let $assert_cond= $ils_ch2 = 1 --source include/assert.inc --let $assert_text= Collected InnoDB LSN is in correct boundaries --let $ils_innodb_lsn= `SELECT JSON_EXTRACT(storage_engines, "$.InnoDB.LSN") FROM ils_copy` --let $assert_cond= $innodb_lsn_after >= $ils_innodb_lsn AND $ils_innodb_lsn >= $innodb_lsn_before --source include/assert.inc --let $assert_text= Collected InnoDB LSN_checkpoint is in correct boundaries --let $ils_innodb_lsn_checkpoint = `SELECT JSON_EXTRACT(storage_engines, "$.InnoDB.LSN_checkpoint") FROM ils_copy` --let $assert_cond= $innodb_lsn_checkpoint_after >= $ils_innodb_lsn_checkpoint AND $ils_innodb_lsn_checkpoint >= $innodb_lsn_checkpoint_before --source include/assert.inc # Cleanup --source include/rpl_connection_slave.inc --source include/remove_debug_point.inc RESET SLAVE ALL FOR CHANNEL 'ch2'; --remove_file $ils_dump --source include/rpl_connection_master.inc DROP TABLE ils_copy, t1_innodb, t2_myisam; --source include/rpl_end.inc