From: Andrei Elkin Date: March 16 2011 2:44pm Subject: bzr commit into mysql-trunk branch (andrei.elkin:3766) Bug#11765758 List-Archive: http://lists.mysql.com/commits/133134 X-Bug: 11765758 Message-Id: <201103161444.p2GEiaC0031558@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2080560686==" --===============2080560686== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk/ based on revid:chuck.bell@stripped 3766 Andrei Elkin 2011-03-16 Bug#11765758 - 58754 rpl_corruption fails. There are two issues: io thread error code mismatch and a crash. The mismatch is benign and is possible due to the current style of error reporting allowing multiple errors to be pushed. The crash is caused by concurrent access of @@global.debug reader (IO thread) and a user connection that updates the var at that time. Fixed with modifying rpl_corruption and few other potentially vulnerable tests, adding notes to the replication failure simulator writer. The rule of thumb for using @@global.debug in replication thread failure simulation: ----------------------------------------------------------------------------------- Update the variable when the slave threads or the master dump thread are down or they are guaranteed to stay idle e.g in waiting for an event. Changing the value while a replication thread is UP can cause reading a partial results of the change to end up in a crash. For the dump thread one has to consider that a possible small hearbeat period won't break waiting for an event in the binlog. @ mysql-test/extra/rpl_tests/rpl_get_master_version_and_clock.test added a note explaining why @@global.debug is safe to update at that point. @ mysql-test/extra/rpl_tests/rpl_stop_middle_group.test made set global debug safe with the explicit stopping the slave prior to the assignement. @ mysql-test/suite/rpl/r/rpl_corruption.result results updated. @ mysql-test/suite/rpl/r/rpl_init_slave_errors.result results updated. @ mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result results updated. @ mysql-test/suite/rpl/t/rpl_corruption.test added a note explaining how @@global.debug can be updated safely. @ mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test added a note explaining why @@global.debug is safe to update at that point. @ mysql-test/suite/rpl/t/rpl_init_slave_errors.test made set global debug safe with the explicit stopping the slave prior to the assignement. @ mysql-test/suite/rpl/t/rpl_show_slave_running.test made set global debug safe with syncing the slave prior to the assignement. modified: mysql-test/extra/rpl_tests/rpl_get_master_version_and_clock.test mysql-test/extra/rpl_tests/rpl_stop_middle_group.test mysql-test/suite/rpl/r/rpl_corruption.result mysql-test/suite/rpl/r/rpl_init_slave_errors.result mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result mysql-test/suite/rpl/t/rpl_corruption.test mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test mysql-test/suite/rpl/t/rpl_init_slave_errors.test mysql-test/suite/rpl/t/rpl_show_slave_running.test sql/rpl_slave.cc === modified file 'mysql-test/extra/rpl_tests/rpl_get_master_version_and_clock.test' --- a/mysql-test/extra/rpl_tests/rpl_get_master_version_and_clock.test 2010-12-19 17:22:30 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_get_master_version_and_clock.test 2011-03-16 14:44:30 +0000 @@ -71,6 +71,13 @@ source include/wait_for_slave_io_error.i # now to avoid restarting IO-thread to re-enter it. # There will be a new IO thread forked out with its @@session.debug # unset. + +# +# Note, due to # Bug#11765758 - 58754 +# make sure the slave threads stand still (SQL thread in this context) +# while @@global.debug is being updated. +# + eval set @@global.debug = "-d,$dbug_sync_point"; --let $rpl_server_number= 1 === modified file 'mysql-test/extra/rpl_tests/rpl_stop_middle_group.test' --- a/mysql-test/extra/rpl_tests/rpl_stop_middle_group.test 2011-02-23 20:01:27 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_stop_middle_group.test 2011-03-16 14:44:30 +0000 @@ -47,6 +47,7 @@ source include/wait_for_slave_sql_to_sto --let $assert_cond= [SELECT COUNT(*) AS Val FROM ti, Val, 1] = 1 --source include/assert.inc +--source include/stop_slave.inc set @@global.debug="-d"; # @@ -104,6 +105,7 @@ let $slave_sql_errno= 1593; # ER_SLAVE_F --let $assert_cond= [SELECT COUNT(*) AS Val FROM ti, Val, 1] = 0 --source include/assert.inc +--source include/stop_slave.inc set @@global.debug="-d"; # @@ -146,6 +148,7 @@ let $slave_sql_errno= 1593; # ER_SLAVE_F --let $assert_cond= [SELECT MAX(a) AS Val FROM ti, Val, 1] = 1 --source include/assert.inc +--source include/stop_slave.inc set @@global.debug="-d"; # === modified file 'mysql-test/suite/rpl/r/rpl_corruption.result' --- a/mysql-test/suite/rpl/r/rpl_corruption.result 2011-03-13 19:56:40 +0000 +++ b/mysql-test/suite/rpl/r/rpl_corruption.result 2011-03-16 14:44:30 +0000 @@ -12,32 +12,32 @@ SET @old_master_verify_checksum = @@mast CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY, b VARCHAR(10), c VARCHAR(100)); include/stop_slave.inc # 2. Corruption in master binlog and SHOW BINLOG EVENTS -SET GLOBAL debug="d,corrupt_read_log_event_char"; +SET GLOBAL debug="+d,corrupt_read_log_event_char"; SHOW BINLOG EVENTS; ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Wrong offset or I/O error -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_read_log_event_char"; # 3. Master read a corrupted event from binlog and send the error to slave -SET GLOBAL debug="d,corrupt_read_log_event"; +SET GLOBAL debug="+d,corrupt_read_log_event"; START SLAVE IO_THREAD; include/wait_for_slave_io_error.inc [errno=1236] -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_read_log_event"; # 4. Master read a corrupted event from binlog and send it to slave SET GLOBAL master_verify_checksum=0; -SET GLOBAL debug="d,corrupt_read_log_event"; +SET GLOBAL debug="+d,corrupt_read_log_event"; START SLAVE IO_THREAD; include/wait_for_slave_io_error.inc [errno=1595,1722] -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_read_log_event"; SET GLOBAL master_verify_checksum=1; # 5. Slave. Corruption in network -SET GLOBAL debug="d,corrupt_queue_event"; +SET GLOBAL debug="+d,corrupt_queue_event"; START SLAVE IO_THREAD; include/wait_for_slave_io_error.inc [errno=1595,1722] -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_queue_event"; # 6. Slave. Corruption in relay log -SET GLOBAL debug="d,corrupt_read_log_event_char"; -START SLAVE; +SET GLOBAL debug="+d,corrupt_read_log_event_char"; +START SLAVE SQL_THREAD; include/wait_for_slave_sql_error.inc [errno=1593] -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_read_log_event_char"; # 7. Seek diff for tables on master and slave include/start_slave.inc include/diff_tables.inc [master:t1, slave:t1] === modified file 'mysql-test/suite/rpl/r/rpl_init_slave_errors.result' --- a/mysql-test/suite/rpl/r/rpl_init_slave_errors.result 2011-02-23 09:31:37 +0000 +++ b/mysql-test/suite/rpl/r/rpl_init_slave_errors.result 2011-03-16 14:44:30 +0000 @@ -7,6 +7,9 @@ start slave; include/wait_for_slave_sql_error.inc [errno=1593] Last_SQL_Error = 'Failed during slave thread initialization' call mtr.add_suppression("Failed during slave.* thread initialization"); +include/stop_slave_io.inc +Warnings: +Note 1255 Slave already has been stopped SET GLOBAL debug= ""; reset slave; SET GLOBAL init_slave= "garbage"; === modified file 'mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result' --- a/mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result 2011-03-16 14:44:30 +0000 @@ -18,6 +18,7 @@ include/check_slave_no_error.inc include/assert.inc [Everything that was read, was executed] include/assert.inc [There is one row in table tm] include/assert.inc [There is one row in table ti] +include/stop_slave.inc set @@global.debug="-d"; include/start_slave.inc truncate table tm; @@ -35,8 +36,11 @@ Last_SQL_Error = 'Fatal error: ... The s include/assert.inc [Not everything that was read, was executed] include/assert.inc [There is one row in table tm] include/assert.inc [There is no row in table ti] +include/stop_slave.inc set @@global.debug="-d"; stop slave; +Warnings: +Note 1255 Slave already has been stopped truncate table tm; include/start_slave.inc set @@global.debug="+d,stop_slave_middle_group"; @@ -47,6 +51,7 @@ Last_SQL_Error = 'Fatal error: ... The s include/assert.inc [Not everything that was read, was executed] include/assert.inc [The max value for field 'a' is 2] include/assert.inc [The max value for field 'a' is 1] +include/stop_slave.inc set @@global.debug="-d"; include/rpl_reset.inc drop table tm, ti; === modified file 'mysql-test/suite/rpl/t/rpl_corruption.test' --- a/mysql-test/suite/rpl/t/rpl_corruption.test 2011-03-13 19:56:40 +0000 +++ b/mysql-test/suite/rpl/t/rpl_corruption.test 2011-03-16 14:44:30 +0000 @@ -7,6 +7,14 @@ # - in relay log ############################################################ +# +# The tests intensively utilize @@global.debug. Note, +# Bug#11765758 - 58754, +# updatating the global is crash-safe only if a. slave threads are down +# or b. it's guaranteed they are standing still and won't execute +# and DBUG-stack code. +# + --source include/have_debug.inc --source include/master-slave.inc @@ -56,17 +64,10 @@ while ($i) { } --enable_query_log -# -# Bug #58630 shows `+d' syntax has a side effect Andrei changed it to -# unsigned `d' version which does not affect the tests logics. -# todo: -# restore *all* following `SET GLOBAL debug' back to `+|-d' when Bug -# #58630, OBug#11765758 sorted out -# # Emulate corruption in binlog file when SHOW BINLOG EVENTS is executing --echo # 2. Corruption in master binlog and SHOW BINLOG EVENTS -SET GLOBAL debug="d,corrupt_read_log_event_char"; +SET GLOBAL debug="+d,corrupt_read_log_event_char"; --echo SHOW BINLOG EVENTS; --disable_query_log send_eval SHOW BINLOG EVENTS FROM $pos; @@ -74,50 +75,50 @@ send_eval SHOW BINLOG EVENTS FROM $pos; --error ER_ERROR_WHEN_EXECUTING_COMMAND reap; -# see above comments on `+d' syntax -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_read_log_event_char"; # Emulate corruption on master with crc checking on master --echo # 3. Master read a corrupted event from binlog and send the error to slave -SET GLOBAL debug="d,corrupt_read_log_event"; +SET GLOBAL debug="+d,corrupt_read_log_event"; --connection slave START SLAVE IO_THREAD; let $slave_io_errno= 1236; --source include/wait_for_slave_io_error.inc --connection master -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_read_log_event"; # Emulate corruption on master without crc checking on master --echo # 4. Master read a corrupted event from binlog and send it to slave --connection master SET GLOBAL master_verify_checksum=0; -SET GLOBAL debug="d,corrupt_read_log_event"; +SET GLOBAL debug="+d,corrupt_read_log_event"; --connection slave START SLAVE IO_THREAD; let $slave_io_errno= 1595,1722; --source include/wait_for_slave_io_error.inc --connection master -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_read_log_event"; SET GLOBAL master_verify_checksum=1; # Emulate corruption in network --echo # 5. Slave. Corruption in network --connection slave -SET GLOBAL debug="d,corrupt_queue_event"; +SET GLOBAL debug="+d,corrupt_queue_event"; START SLAVE IO_THREAD; let $slave_io_errno= 1595,1722; --source include/wait_for_slave_io_error.inc -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_queue_event"; # Emulate corruption in relay log --echo # 6. Slave. Corruption in relay log -SET GLOBAL debug="d,corrupt_read_log_event_char"; -START SLAVE; +SET GLOBAL debug="+d,corrupt_read_log_event_char"; + +START SLAVE SQL_THREAD; let $slave_sql_errno= 1593; --source include/wait_for_slave_sql_error.inc -SET GLOBAL debug=""; +SET GLOBAL debug="-d,corrupt_read_log_event_char"; # Start normal replication and compare same table on master # and slave === modified file 'mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test' --- a/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test 2010-12-19 17:22:30 +0000 +++ b/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test 2011-03-16 14:44:30 +0000 @@ -47,6 +47,11 @@ let $dbug_sync_point= 'dbug.before_get_M let $debug_sync_action= 'now SIGNAL signal.get_master_uuid'; source extra/rpl_tests/rpl_get_master_version_and_clock.test; +# +# Note, due to # Bug#11765758 - 58754 +# make sure the slave threads stand still (SQL thread in this context) +# while @@global.debug is being updated. +# eval set global debug= '$debug_saved'; #Test case 4: This test checks that the slave I/O thread refuses to start === modified file 'mysql-test/suite/rpl/t/rpl_init_slave_errors.test' --- a/mysql-test/suite/rpl/t/rpl_init_slave_errors.test 2011-02-23 09:31:37 +0000 +++ b/mysql-test/suite/rpl/t/rpl_init_slave_errors.test 2011-03-16 14:44:30 +0000 @@ -60,6 +60,10 @@ start slave; call mtr.add_suppression("Failed during slave.* thread initialization"); +# Bug#11765758 - 58754 +# make sure the dump thread has sent the queries and +# is inactive to allow safe updating to @@global.debug +--source include/stop_slave_io.inc SET GLOBAL debug= ""; ###################################################################### === modified file 'mysql-test/suite/rpl/t/rpl_show_slave_running.test' --- a/mysql-test/suite/rpl/t/rpl_show_slave_running.test 2010-12-19 17:22:30 +0000 +++ b/mysql-test/suite/rpl/t/rpl_show_slave_running.test 2011-03-16 14:44:30 +0000 @@ -76,9 +76,16 @@ echo Slave_SQL_Running= $status; # cleanup -connection slave; +connection master; + +# Bug#11765758 - 58754 +# make sure the slave has processed all sent queries and +# is idling to allow safe updating to @@global.debug +#connection slave; +sync_slave_with_master; eval set global debug= '$debug_saved'; + SET DEBUG_SYNC= 'RESET'; --echo End of tests --source include/rpl_end.inc === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2011-03-14 13:55:44 +0000 +++ b/sql/rpl_slave.cc 2011-03-16 14:44:30 +0000 @@ -4372,7 +4372,7 @@ static int queue_event(Master_info* mi,c int debug_cor_pos = rand() % (event_len - BINLOG_CHECKSUM_LEN); debug_event_buf_c[debug_cor_pos] =~ debug_event_buf_c[debug_cor_pos]; DBUG_PRINT("info", ("Corrupt the event at queue_event: byte on position %d", debug_cor_pos)); - DBUG_SET(""); + DBUG_SET("-d,corrupt_queue_event"); } ); --===============2080560686== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/andrei.elkin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: andrei.elkin@stripped # target_branch: file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk/ # testament_sha1: 8655aec2424d38df0d343210ca9b6cbd41faeca5 # timestamp: 2011-03-16 16:44:36 +0200 # source_branch: file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk-\ # bugfixing/ # base_revision_id: chuck.bell@stripped\ # z1h6n8s2rwcunm1l # # Begin bundle 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 --===============2080560686==--