|
| 1 | +############################################################################### |
| 2 | +# Bug #17026898 PREVIOUS GTID EVENT IS NOT WRITTEN WHEN BINLOG IS ROTATED VIA |
| 3 | +# SIGHUP |
| 4 | + |
| 5 | +# Problem: When Bin(Relay)log is rotated via SIGHUP signal, the newly generated |
| 6 | +# binlog does not contain previous gtid event which is very important |
| 7 | +# for processing that bin(relay)log's gtid events later. |
| 8 | + |
| 9 | +# Fix: If reload_acl_and_cache() (which does rotation of Bin(Relay) log) |
| 10 | +# is called from SIGHUP handler, then allocate temporary THD for |
| 11 | +# execution of rotate bin(relay)log. |
| 12 | + |
| 13 | +# Steps to reproduce the issue: |
| 14 | +# 1) Get the server pid |
| 15 | +# 2) Send Kill -1 signal (SIGHUP) signal to server pid |
| 16 | +# 3) Wait until rotation is done |
| 17 | +# 4) Verify the newly generated log contains prev_gtid_event |
| 18 | +# 5) Restart the server to see the processing of the new log is not an issue. |
| 19 | +# 6) Verify that Replication works fine at the end of the scenario |
| 20 | + |
| 21 | +# Execute the same steps on both Master and Slave do prove that |
| 22 | +# a) no problem in binary log rotation (i.e., prev_gtids_event exists) |
| 23 | +# b) no problem in relay log rotation (i.e., prev_gtids event exists) |
| 24 | +# c) no problem in restarting master |
| 25 | +# d) no problem in restarting slave |
| 26 | +# e) Replication works fine after receiving SIGHUP. |
| 27 | +############################################################################### |
| 28 | + |
| 29 | +# Test involves sending SIGHUP signal using kill linux cmd |
| 30 | +--source include/linux.inc |
| 31 | + |
| 32 | +# Problem appears only with gtid |
| 33 | +--source include/have_gtid.inc |
| 34 | + |
| 35 | +# Testing SIGHUP behaviour with one mode is enough |
| 36 | +--source include/have_binlog_format_statement.inc |
| 37 | +--source include/master-slave.inc |
| 38 | +CREATE TABLE pid_table(pid_no INT); |
| 39 | + |
| 40 | + |
| 41 | +# Execute above mentioned steps in two iterations |
| 42 | +# Iteration 1 : Master and Iteration 2: Slave |
| 43 | +--let $_rpl_server= 1 |
| 44 | +while ($_rpl_server <= 2) |
| 45 | +{ |
| 46 | + --let $rpl_connection_name= server_$_rpl_server |
| 47 | + --source include/rpl_connection.inc |
| 48 | + --let $pid_file=`SELECT @@pid_file` |
| 49 | + --replace_result $pid_file pid_file |
| 50 | + --eval LOAD DATA LOCAL INFILE '$pid_file' INTO TABLE pid_table |
| 51 | + # Step1: Get server pid |
| 52 | + --let $server_pid=`SELECT pid_no FROM pid_table` |
| 53 | + |
| 54 | + # Get current master binlog name |
| 55 | + if ($_rpl_server == 1) |
| 56 | + { |
| 57 | + --let $before_sighup_log_name=query_get_value(SHOW MASTER STATUS, File, 1) |
| 58 | + } |
| 59 | + if ($_rpl_server == 2) |
| 60 | + { |
| 61 | + --let $before_sighup_log_name=query_get_value(SHOW SLAVE STATUS, Relay_Log_File, 1) |
| 62 | + } |
| 63 | + |
| 64 | + # Step2: send SIGHUP(signal 1) to server which will rotate bin(relay)log |
| 65 | + --exec kill -1 $server_pid |
| 66 | + |
| 67 | + # Step3: Wait until signal handler does required work |
| 68 | + # (i.e., completes rotation of binary/relay log) after receiving SIGHUP signal. |
| 69 | + if ($_rpl_server == 1) |
| 70 | + { |
| 71 | + --let $show_statement=SHOW MASTER STATUS |
| 72 | + --let $field=File |
| 73 | + } |
| 74 | + if ($_rpl_server == 2) |
| 75 | + { |
| 76 | + --let $show_statement=SHOW SLAVE STATUS |
| 77 | + --let $field=Relay_Log_File |
| 78 | + } |
| 79 | + --let $condition= <> '$before_sighup_log_name' |
| 80 | + --source include/wait_show_condition.inc |
| 81 | + |
| 82 | + # Write something to newly generated binary log/relay log |
| 83 | + if ($_rpl_server == 2) |
| 84 | + { |
| 85 | + --let $rpl_connection_name= server_1 |
| 86 | + --source include/rpl_connection.inc |
| 87 | + } |
| 88 | + DELETE FROM pid_table; |
| 89 | + --source include/sync_slave_sql_with_master.inc |
| 90 | + if ($_rpl_server == 1) |
| 91 | + { |
| 92 | + --let $rpl_connection_name= server_1 |
| 93 | + --source include/rpl_connection.inc |
| 94 | + } |
| 95 | + # Step 4:Show that newly generated binary/relaylog has previous gtid event as well |
| 96 | + --let $keep_gtid_events= 1 |
| 97 | + --let $binlog_file= LAST |
| 98 | + if ($_rpl_server == 1) |
| 99 | + { |
| 100 | + --source include/show_binlog_events.inc |
| 101 | + } |
| 102 | + if ($_rpl_server == 2) |
| 103 | + { |
| 104 | + --source include/show_relaylog_events.inc |
| 105 | + } |
| 106 | + # Step5: Restart server to make sure that |
| 107 | + # newly generated binary log/relay log does not cause any issues |
| 108 | + --let $rpl_server_number= $_rpl_server |
| 109 | + --source include/rpl_stop_server.inc |
| 110 | + --let $rpl_start_with_gtids= 1 |
| 111 | + --source include/rpl_start_server.inc |
| 112 | + if ($_rpl_server == 2) |
| 113 | + { |
| 114 | + --source include/rpl_start_slaves.inc |
| 115 | + } |
| 116 | + --inc $_rpl_server |
| 117 | +} |
| 118 | + |
| 119 | +# Now just make sure replication works fine |
| 120 | +--let $rpl_connection_name= server_1 |
| 121 | +--source include/rpl_connection.inc |
| 122 | +DROP TABLE pid_table; |
| 123 | +--source include/sync_slave_sql_with_master.inc |
| 124 | + |
| 125 | +--source include/rpl_end.inc |
0 commit comments