From: Li-Bing.Song Date: January 20 2010 8:37am Subject: bzr commit into mysql-5.1-rep-semisync branch (Li-Bing.Song:3127) Bug#50157 List-Archive: http://lists.mysql.com/commits/97490 X-Bug: 50157 Message-Id: <201001200838.o0K8cTKj029000@anders-server> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7932197171002498791==" --===============7932197171002498791== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/anders/work/bzrroot/mysql-5.1-rep-semisync/ based on revid:zhenxing.he@stripped 3127 Li-Bing.Song@stripped 2010-01-20 BUG#50157 Assertion !active_tranxs_->is_tranx_end_pos(..) in ReplSemiSyncMaster::commitTrx The root cause of the crash is that a TranxNode is freed before it is used. A TranxNode is created when each time some log events are written into binlog file and is synchronized. TranxNodes' memories are allocted from mem_root of the current thread, and will be freed immediately after current statement ending. Sometimes, a statement ends and its TranxNode is freed before it is cleared from TranxNode list. So the Pointer of the TranxNode in TranxNode list becomes a wild pointer. After this patch, One statement always waits until its log events has been replicated completely if it has been binlogged and synchronized. For the TranxNode will be cleared from the TranxNode list after the log event has been replicated. @ sql/rpl_handler.cc params are not initialized. added: mysql-test/suite/rpl/r/rpl_semi_sync_mixed_tables.result mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables-master.opt mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables-slave.opt mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables.test modified: plugin/semisync/semisync_master_plugin.cc sql/rpl_handler.cc === added file 'mysql-test/suite/rpl/r/rpl_semi_sync_mixed_tables.result' --- a/mysql-test/suite/rpl/r/rpl_semi_sync_mixed_tables.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_semi_sync_mixed_tables.result 2010-01-20 08:37:18 +0000 @@ -0,0 +1,36 @@ +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; + +############################################################################## +# BUG#50157 +# semi-sync replication crashes when 'CREATE TEMPORARY TABLE `MyISAM_t` SELECT +# * FROM `Innodb_t`; +############################################################################## +SET AUTOCOMMIT= 0; +CREATE TABLE t2(c1 INT) ENGINE=innodb; +call mtr.add_suppression(".*"); +INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; +SET GLOBAL rpl_semi_sync_master_enabled = 1; +SET GLOBAL rpl_semi_sync_master_trace_level= 80; +STOP SLAVE; +INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; +SET GLOBAL rpl_semi_sync_slave_enabled = 1; +START SLAVE; +BEGIN; + +# Even though it is in a transaction, this statement is binlogged into binlog +# file immediately. +CREATE TEMPORARY TABLE t1 LIKE t2; + +# These statements will not binlogged until the transaction is committed +INSERT INTO t2 VALUES(11); +INSERT INTO t2 VALUES(22); +COMMIT; + +UNINSTALL PLUGIN rpl_semi_sync_slave; +UNINSTALL PLUGIN rpl_semi_sync_master; +DROP TABLE t1, t2; === added file 'mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables-master.opt' --- a/mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables-master.opt 2010-01-20 08:37:18 +0000 @@ -0,0 +1 @@ +$SEMISYNC_PLUGIN_OPT === added file 'mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables-slave.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables-slave.opt 2010-01-20 08:37:18 +0000 @@ -0,0 +1 @@ +$SEMISYNC_PLUGIN_OPT === added file 'mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables.test' --- a/mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_semi_sync_mixed_tables.test 2010-01-20 08:37:18 +0000 @@ -0,0 +1,53 @@ +source include/have_semisync_plugin.inc; +source include/not_embedded.inc; +source include/have_innodb.inc; +source include/have_binlog_format_statement.inc; +source include/master-slave.inc; + +--echo +--echo ############################################################################## +--echo # BUG#50157 +--echo # semi-sync replication crashes when 'CREATE TEMPORARY TABLE `MyISAM_t` SELECT +--echo # * FROM `Innodb_t`; +--echo ############################################################################## + +SET AUTOCOMMIT= 0; +CREATE TABLE t2(c1 INT) ENGINE=innodb; +sync_slave_with_master; + +connection master; +call mtr.add_suppression(".*"); +eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_PLUGIN'; +SET GLOBAL rpl_semi_sync_master_enabled = 1; +SET GLOBAL rpl_semi_sync_master_trace_level= 80; + +connection slave; +STOP SLAVE; +source include/wait_for_slave_to_stop.inc; + +eval INSTALL PLUGIN rpl_semi_sync_slave SONAME '$SEMISYNC_SLAVE_PLUGIN'; +SET GLOBAL rpl_semi_sync_slave_enabled = 1; + +START SLAVE; +source include/wait_for_slave_to_start.inc; + +connection master; +BEGIN; +--echo +--echo # Even though it is in a transaction, this statement is binlogged into binlog +--echo # file immediately. +CREATE TEMPORARY TABLE t1 SELECT c1 FROM t2 where 1=1; +--echo +--echo # These statements will not binlogged until the transaction is committed +INSERT INTO t2 VALUES(11); +INSERT INTO t2 VALUES(22); +COMMIT; +sync_slave_with_master; + +--echo +UNINSTALL PLUGIN rpl_semi_sync_slave; +connection master; +UNINSTALL PLUGIN rpl_semi_sync_master; + +DROP TABLE t1, t2; +source include/master-slave-end.inc; === modified file 'plugin/semisync/semisync_master_plugin.cc' --- a/plugin/semisync/semisync_master_plugin.cc 2009-10-18 12:29:03 +0000 +++ b/plugin/semisync/semisync_master_plugin.cc 2010-01-20 08:37:18 +0000 @@ -46,10 +46,7 @@ int repl_semi_request_commit(Trans_param int repl_semi_report_commit(Trans_param *param) { - - bool is_real_trans= param->flags & TRANS_IS_REAL_TRANS; - - if (is_real_trans && param->log_pos) + if (param->log_pos) { const char *binlog_name= param->log_file; return repl_semisync.commitTrx(binlog_name, param->log_pos); === modified file 'sql/rpl_handler.cc' --- a/sql/rpl_handler.cc 2009-12-04 01:46:33 +0000 +++ b/sql/rpl_handler.cc 2010-01-20 08:37:18 +0000 @@ -190,8 +190,8 @@ int Trans_delegate::after_commit(THD *th { Trans_param param; bool is_real_trans= (all || thd->transaction.all.ha_list == 0); - if (is_real_trans) - param.flags |= TRANS_IS_REAL_TRANS; + + param.flags = is_real_trans ? TRANS_IS_REAL_TRANS : 0; Trans_binlog_info *log_info= my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO); @@ -218,8 +218,8 @@ int Trans_delegate::after_rollback(THD * { Trans_param param; bool is_real_trans= (all || thd->transaction.all.ha_list == 0); - if (is_real_trans) - param.flags |= TRANS_IS_REAL_TRANS; + + param.flags = is_real_trans ? TRANS_IS_REAL_TRANS : 0; Trans_binlog_info *log_info= my_pthread_getspecific_ptr(Trans_binlog_info*, RPL_TRANS_BINLOG_INFO); @@ -228,7 +228,7 @@ int Trans_delegate::after_rollback(THD * param.log_pos= log_info ? log_info->log_pos : 0; int ret= 0; - FOREACH_OBSERVER(ret, after_commit, thd, (¶m)); + FOREACH_OBSERVER(ret, after_rollback, thd, (¶m)); /* This is the end of a real transaction or autocommit statement, we @@ -249,6 +249,7 @@ int Binlog_storage_delegate::after_flush { Binlog_storage_param param; uint32 flags=0; + if (synced) flags |= BINLOG_STORAGE_IS_SYNCED; --===============7932197171002498791== 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/anders/work/bzrroot/mysql-5.1-rep-\ # semisync/ # testament_sha1: 7ef5e23e9d69fa8f34dcaea29e32d8f8cd15b15e # timestamp: 2010-01-20 16:37:29 +0800 # base_revision_id: zhenxing.he@stripped\ # a4nbo9003sb8j9gu # # Begin bundle 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 --===============7932197171002498791==--