From: Li-Bing.Song Date: January 17 2011 10:26pm Subject: bzr commit into mysql-5.1 branch (Li-Bing.Song:3559) Bug#58546 List-Archive: http://lists.mysql.com/commits/129080 X-Bug: 58546 Message-Id: <20110118043525.11429A26F4@localhost.localdomain> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4952634904928385453==" --===============4952634904928385453== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/songlibing/bzrwork/wt3/mysql-5.1/ based on revid:vinay.fisrekar@stripped 3559 Li-Bing.Song@stripped 2011-01-18 Bug#58546 test rpl_packet timeout failure sporadically on PB rpl_packet got a timeout failure sporadically on PB when stopping slave. The real reason of this bug is that STOP SLAVE stopped IO thread first and then stopped SQL thread. It was possible that IO thread stopped after replicating part of a transaction which SQL thread was executing. SQL thread would be hung if the transaction could not be rolled back safely. After this patch, STOP SLAVE will stop SQL thread first and then stop IO thread, which guarantees that IO thread will fetch the reset of the events of the transaction that SQL thread is executing, so that SQL thread can finish the transaction if it cannot be rolled back safely. Added below auxiliary files to make the test code neater. restart_slave_sql.inc rpl_connection_master.inc rpl_connection_slave.inc rpl_connection_slave1.inc added: mysql-test/include/restart_slave_sql.inc mysql-test/include/rpl_connection_master.inc mysql-test/include/rpl_connection_slave.inc mysql-test/include/rpl_connection_slave1.inc modified: mysql-test/suite/rpl/r/rpl_stop_slave.result mysql-test/suite/rpl/t/rpl_packet.test mysql-test/suite/rpl/t/rpl_stop_slave.test sql/slave.cc sql/sql_repl.cc === added file 'mysql-test/include/restart_slave_sql.inc' --- a/mysql-test/include/restart_slave_sql.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/restart_slave_sql.inc 2011-01-17 22:26:04 +0000 @@ -0,0 +1,43 @@ +# ==== Purpose ==== +# +# Provide a earier way to restart SQL thread when you want to stop sql thread +# and then start it immediately. +# +# Sources stop_slave_sql.inc to stop SQL thread on the current connection. +# Then issues START SLAVE SQL_THREAD and then waits until +# the SQL threads have started, or until a timeout is reached. +# +# Please use this instead of 'STOP|START SLAVE SQL_THREAD', to reduce the risk of +# test case bugs. +# +# +# ==== Usage ==== +# +# [--let $slave_timeout= NUMBER] +# [--let $rpl_debug= 1] +# --source include/restart_slave_sql.inc +# +# Parameters: +# $slave_timeout +# See include/wait_for_slave_param.inc +# +# $rpl_debug +# See include/rpl_init.inc + + +--let $include_filename= restart_slave.inc +--source include/begin_include_file.inc + + +if (!$rpl_debug) +{ + --disable_query_log +} + +source include/stop_slave_sql.inc; +START SLAVE SQL_THREAD; +source include/wait_for_slave_sql_to_start.inc; + + +--let $include_filename= restart_slave.inc +--source include/end_include_file.inc \ No newline at end of file === added file 'mysql-test/include/rpl_connection_master.inc' --- a/mysql-test/include/rpl_connection_master.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/rpl_connection_master.inc 2011-01-17 22:26:04 +0000 @@ -0,0 +1,2 @@ +let $rpl_connection_name= master; +source include/rpl_connection.inc; \ No newline at end of file === added file 'mysql-test/include/rpl_connection_slave.inc' --- a/mysql-test/include/rpl_connection_slave.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/rpl_connection_slave.inc 2011-01-17 22:26:04 +0000 @@ -0,0 +1,2 @@ +let $rpl_connection_name= slave; +source include/rpl_connection.inc; \ No newline at end of file === added file 'mysql-test/include/rpl_connection_slave1.inc' --- a/mysql-test/include/rpl_connection_slave1.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/rpl_connection_slave1.inc 2011-01-17 22:26:04 +0000 @@ -0,0 +1,2 @@ +let $rpl_connection_name= slave1; +source include/rpl_connection.inc; \ No newline at end of file === modified file 'mysql-test/suite/rpl/r/rpl_stop_slave.result' --- a/mysql-test/suite/rpl/r/rpl_stop_slave.result 2010-12-19 17:07:28 +0000 +++ b/mysql-test/suite/rpl/r/rpl_stop_slave.result 2011-01-17 22:26:04 +0000 @@ -128,5 +128,47 @@ START SLAVE SQL_THREAD; include/wait_for_slave_sql_to_start.inc # Test end SET GLOBAL debug= '$debug_save'; +include/restart_slave.inc +[connection master] DROP TABLE t1, t2; + +# Bug#58546 test rpl_packet timeout failure sporadically on PB +# ---------------------------------------------------------------------- +# STOP SLAVE stopped IO thread first and then stopped SQL thread. It was +# possible that IO thread stopped after replicating part of a transaction +# which SQL thread was executing. SQL thread would be hung if the +# transaction could not be rolled back safely. +# It caused some sporadic failures on PB2. +# +# This test verifies that when 'STOP SLAVE' is issued by a user, IO +# thread will continue to fetch the rest events of the transaction which +# is being executed by SQL thread and is not able to be rolled back safely. +CREATE TABLE t1 (c1 INT KEY, c2 INT) ENGINE=InnoDB; +CREATE TABLE t2 (c1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES(1, 1); +SET GLOBAL debug= 'd,dump_thread_wait_before_send_xid'; +[connection slave] +include/restart_slave.inc +BEGIN; +UPDATE t1 SET c2 = 2 WHERE c1 = 1; +[connection master] +BEGIN; +INSERT INTO t1 VALUES(2, 2); +INSERT INTO t2 VALUES(1); +UPDATE t1 SET c2 = 3 WHERE c1 = 1; +COMMIT; +[connection slave1] +STOP SLAVE; +[connection slave] +ROLLBACK; +[connection master] +SET DEBUG_SYNC= 'now SIGNAL signal.continue'; +SET DEBUG_SYNC= 'RESET'; +[connection slave] +include/wait_for_slave_to_stop.inc +[connection slave1] +include/start_slave.inc +[connection master] +DROP TABLE t1, t2; +SET GLOBAL debug= $debug_save; include/rpl_end.inc === modified file 'mysql-test/suite/rpl/t/rpl_packet.test' --- a/mysql-test/suite/rpl/t/rpl_packet.test 2010-12-19 17:07:28 +0000 +++ b/mysql-test/suite/rpl/t/rpl_packet.test 2011-01-17 22:26:04 +0000 @@ -26,8 +26,8 @@ let $old_net_buffer_length= `SELECT @@gl SET @@global.max_allowed_packet=1024; SET @@global.net_buffer_length=1024; +sync_slave_with_master; # Restart slave for setting to take effect -connection slave; source include/stop_slave.inc; source include/start_slave.inc; === modified file 'mysql-test/suite/rpl/t/rpl_stop_slave.test' --- a/mysql-test/suite/rpl/t/rpl_stop_slave.test 2010-12-19 17:07:28 +0000 +++ b/mysql-test/suite/rpl/t/rpl_stop_slave.test 2011-01-17 22:26:04 +0000 @@ -54,7 +54,69 @@ source extra/rpl_tests/rpl_stop_slave.te --echo # Test end SET GLOBAL debug= '$debug_save'; +source include/restart_slave_sql.inc; -connection master; +--source include/rpl_connection_master.inc DROP TABLE t1, t2; + +--echo +--echo # Bug#58546 test rpl_packet timeout failure sporadically on PB +--echo # ---------------------------------------------------------------------- +--echo # STOP SLAVE stopped IO thread first and then stopped SQL thread. It was +--echo # possible that IO thread stopped after replicating part of a transaction +--echo # which SQL thread was executing. SQL thread would be hung if the +--echo # transaction could not be rolled back safely. +--echo # It caused some sporadic failures on PB2. +--echo # +--echo # This test verifies that when 'STOP SLAVE' is issued by a user, IO +--echo # thread will continue to fetch the rest events of the transaction which +--echo # is being executed by SQL thread and is not able to be rolled back safely. + +CREATE TABLE t1 (c1 INT KEY, c2 INT) ENGINE=InnoDB; +CREATE TABLE t2 (c1 INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES(1, 1); + +let $debug_save= `SELECT @@GLOBAL.debug`; +SET GLOBAL debug= 'd,dump_thread_wait_before_send_xid'; + +sync_slave_with_master; + +--source include/rpl_connection_slave.inc +source include/restart_slave_sql.inc; + +BEGIN; +UPDATE t1 SET c2 = 2 WHERE c1 = 1; + +--source include/rpl_connection_master.inc +BEGIN; +INSERT INTO t1 VALUES(2, 2); +INSERT INTO t2 VALUES(1); +UPDATE t1 SET c2 = 3 WHERE c1 = 1; +COMMIT; + +--source include/rpl_connection_slave1.inc +let $show_statement= SHOW PROCESSLIST; +let $field= Info; +let $condition= = 'UPDATE t1 SET c2 = 3 WHERE c1 = 1'; +source include/wait_show_condition.inc; + +send STOP SLAVE; + +--source include/rpl_connection_slave.inc +ROLLBACK; + +--source include/rpl_connection_master.inc +SET DEBUG_SYNC= 'now SIGNAL signal.continue'; +SET DEBUG_SYNC= 'RESET'; + +--source include/rpl_connection_slave.inc +source include/wait_for_slave_to_stop.inc; + +--source include/rpl_connection_slave1.inc +reap; +source include/start_slave.inc; + +--source include/rpl_connection_master.inc +DROP TABLE t1, t2; +SET GLOBAL debug= $debug_save; --source include/rpl_end.inc === modified file 'sql/slave.cc' --- a/sql/slave.cc 2010-11-30 23:32:51 +0000 +++ b/sql/slave.cc 2011-01-17 22:26:04 +0000 @@ -408,17 +408,6 @@ int terminate_slave_threads(Master_info* int error,force_all = (thread_mask & SLAVE_FORCE_ALL); pthread_mutex_t *sql_lock = &mi->rli.run_lock, *io_lock = &mi->run_lock; - if (thread_mask & (SLAVE_IO|SLAVE_FORCE_ALL)) - { - DBUG_PRINT("info",("Terminating IO thread")); - mi->abort_slave=1; - if ((error=terminate_slave_thread(mi->io_thd, io_lock, - &mi->stop_cond, - &mi->slave_running, - skip_lock)) && - !force_all) - DBUG_RETURN(error); - } if (thread_mask & (SLAVE_SQL|SLAVE_FORCE_ALL)) { DBUG_PRINT("info",("Terminating SQL thread")); @@ -430,6 +419,17 @@ int terminate_slave_threads(Master_info* !force_all) DBUG_RETURN(error); } + if (thread_mask & (SLAVE_IO|SLAVE_FORCE_ALL)) + { + DBUG_PRINT("info",("Terminating IO thread")); + mi->abort_slave=1; + if ((error=terminate_slave_thread(mi->io_thd, io_lock, + &mi->stop_cond, + &mi->slave_running, + skip_lock)) && + !force_all) + DBUG_RETURN(error); + } DBUG_RETURN(0); } === modified file 'sql/sql_repl.cc' --- a/sql/sql_repl.cc 2010-07-26 09:56:30 +0000 +++ b/sql/sql_repl.cc 2011-01-17 22:26:04 +0000 @@ -21,6 +21,7 @@ #include "log_event.h" #include "rpl_filter.h" #include +#include "debug_sync.h" int max_binlog_dump_events = 0; // unlimited my_bool opt_sporadic_binlog_dump_fail = 0; @@ -556,6 +557,20 @@ impossible position"; } #endif + DBUG_EXECUTE_IF("dump_thread_wait_before_send_xid", + { + if ((*packet)[EVENT_TYPE_OFFSET+1] == XID_EVENT) + { + net_flush(net); + const char act[]= + "now " + "wait_for signal.continue"; + DBUG_ASSERT(opt_debug_sync_timeout > 0); + DBUG_ASSERT(!debug_sync_set_action(current_thd, + STRING_WITH_LEN(act))); + } + }); + if ((*packet)[EVENT_TYPE_OFFSET+1] == FORMAT_DESCRIPTION_EVENT) { binlog_can_be_corrupted= test((*packet)[FLAGS_OFFSET+1] & @@ -572,6 +587,14 @@ impossible position"; goto err; } + DBUG_EXECUTE_IF("dump_thread_wait_before_send_xid", + { + if ((*packet)[EVENT_TYPE_OFFSET+1] == XID_EVENT) + { + net_flush(net); + } + }); + DBUG_PRINT("info", ("log event code %d", (*packet)[LOG_EVENT_OFFSET+1] )); if ((*packet)[LOG_EVENT_OFFSET+1] == LOAD_EVENT) --===============4952634904928385453== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/li-bing.song@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: li-bing.song@stripped # target_branch: file:///home/songlibing/bzrwork/wt3/mysql-5.1/ # testament_sha1: 044dcda7450351c3afb5f0780f5e2e9e237ea5ea # timestamp: 2011-01-18 06:26:12 +0800 # base_revision_id: vinay.fisrekar@stripped\ # lictvi6f81lzg7nj # # Begin bundle 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 yF3JFOFCQ2lfmnA= --===============4952634904928385453==--