From: Andrei Elkin Date: December 11 2010 7:01pm Subject: bzr push into mysql-next-mr-wl5569 branch (andrei.elkin:3240 to 3241) WL#5569 List-Archive: http://lists.mysql.com/commits/126571 Message-Id: <201012111901.oBBJ1ZC4012520@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0754779704==" --===============0754779704== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3241 Andrei Elkin 2010-12-11 wl#5569 MTS 1. Fixing recovery related issue of DBUG_ASSERT(rli->get_event_relay_log_pos() >= BIN_LOG_HEADER_SIZE); at slave start with shifting mts_recovery_routine() at front of the assert. 2. Making SKIP-ed event to commit to the central RLI. That is correct since Workers are not executing anything at this time. 3. Fixing the default for mts_checkpoint_period which should not be zero normally. Zero makes sense solely for debugging (so we may stress that through VALID_RANGE(1,...). 4. Introduced a general mts-unsupported error/warning to apply to cases of non-zero parallel workers and a feature that parallelization can't work with. @ mysql-test/suite/rpl/r/rpl_parallel_start_stop.result results are updated. @ mysql-test/suite/rpl/t/rpl_parallel_start_stop.test Extending the test to cover UNTIL, SKIP, a temporary to the regular error escalation. modified: mysql-test/suite/rpl/r/rpl_parallel_start_stop.result mysql-test/suite/rpl/t/rpl_parallel_start_stop.test sql/rpl_rli_pdb.cc sql/rpl_slave.cc sql/share/errmsg-utf8.txt sql/sys_vars.cc 3240 Andrei Elkin 2010-12-10 [merge] merge from wl5569 repo to a local branch modified: mysql-test/r/mysqld--help-notwin.result mysql-test/r/mysqld--help-win.result mysql-test/suite/rpl/t/rpl_parallel_start_stop.test sql/dynamic_ids.cc sql/dynamic_ids.h sql/mysqld.cc sql/mysqld.h sql/rpl_rli.cc sql/rpl_rli.h sql/rpl_rli_pdb.h sql/rpl_slave.cc sql/sys_vars.cc === modified file 'mysql-test/suite/rpl/r/rpl_parallel_start_stop.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_start_stop.result 2010-12-02 17:46:46 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_start_stop.result 2010-12-11 19:00:47 +0000 @@ -10,21 +10,77 @@ create view coord_proc_list as SELECT i include/stop_slave.inc set @save.slave_parallel_workers= @@global.slave_parallel_workers; set @@global.slave_parallel_workers= 4; +Warnings: +Note 1724 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. include/start_slave.inc select min(id) from worker_proc_list into @w_id; kill query @w_id; +Warnings: +Note 1724 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. include/start_slave.inc select id from coord_proc_list into @c_id; kill query @c_id; +Warnings: +Note 1724 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. include/start_slave.inc -CREATE TABLE t1 (a int primary key); +CREATE TABLE t1 (a int primary key) engine=innodb; insert into t1 values (1),(2); insert into t1 values (3); insert into t1 values (3); +delete from t1 where a=3; +Warnings: +Note 1724 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. +include/start_slave.inc delete from t1; +insert into t1 values (1),(2),(3); +create table t2m (a int) engine=myisam; +insert into t2m values (1); +begin; +update t1 set a=31 where a=3; +insert into t1 values (5),(6),(7); +begin; +update t1 set a=20 where a=2; +insert into t2m values (2); +update t1 set a=30 where a=3; +commit; +update t1 set a=21 where a=2; +rollback; +Warnings: +Note 1724 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. +include/start_slave.inc +stop slave sql_thread; +set @@global.sql_slave_skip_counter=7; +begin; +select max(a) + 1 from t1 into @a; +insert into t1 set a=@a; +commit; +begin; +select max(a) + 1 from t1 into @a; +insert into t1 set a=@a; +commit; +begin; +select max(a) + 1 from t1 into @a; +insert into t1 set a=@a; +commit; +set @save.slave_transaction_retries= @@global.slave_transaction_retries; +set @@global.slave_transaction_retries= 1; +start slave sql_thread; +Warnings: +Note 1724 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. +include/stop_slave.inc +create table t2 (a int); +insert into t2 values (1); +start slave until master_log_file='master-bin.000001', master_log_pos=2311; +Warnings: +Note 1724 UNTIL condtion is not supported in Parallel Slave. Slave is started in the sequential execution mode. +Warnings: +Note 1724 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. include/start_slave.inc drop table t1; +drop table t2m; +drop table t2; drop view worker_proc_list; drop view coord_proc_list; set @@global.slave_parallel_workers= @save.slave_parallel_workers; +set @@global.slave_transaction_retries= @save.slave_transaction_retries; end of the tests === modified file 'mysql-test/suite/rpl/t/rpl_parallel_start_stop.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_start_stop.test 2010-12-10 12:10:20 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_start_stop.test 2010-12-11 19:00:47 +0000 @@ -3,6 +3,9 @@ # # The test checks START and STOP, graceful, killing or # due to an error of a Worker. +# START is considered to be with UNTIL that forces the sequential execution mode +# and with non-zero @@global.sql_slave_skip_counter that is compatible to +# the parallel mode. # source include/master-slave.inc; @@ -64,18 +67,21 @@ source include/wait_for_slave_sql_to_sto source include/start_slave.inc; -# +## # Errored-out Worker stops the pool and the Coordinator +## + +# +# A. A regular error case # connection master; # make some load -CREATE TABLE t1 (a int primary key); +CREATE TABLE t1 (a int primary key) engine=innodb; insert into t1 values (1),(2); - sync_slave_with_master; #connection slave; @@ -98,14 +104,158 @@ let $table= worker_proc_list; source include/wait_until_rows_count.inc; source include/wait_for_slave_sql_to_stop.inc; +delete from t1 where a=3; + +source include/start_slave.inc; + +connection master; + +sync_slave_with_master; +#connection slave; + +# cleanup but leaving on t1 + +connection master; delete from t1; +sync_slave_with_master; +#connection slave; + +# +# B. In a temporary error execution is not retried +# + +connection master; +insert into t1 values (1),(2),(3); +create table t2m (a int) engine=myisam; # non-trans engine to detect deadlock +insert into t2m values (1); + +sync_slave_with_master; +#connection slave; + +begin; +# set up a deadlock +update t1 set a=31 where a=3; +insert into t1 values (5),(6),(7); + +connection master; + +begin; +update t1 set a=20 where a=2; +insert into t2m values (2); +update t1 set a=30 where a=3; +commit; + + +connection slave; + +let $count= 2; +let $table= t2m; +source include/wait_until_rows_count.inc; + +# must victimize the master trans because of deadlock or timeout +update t1 set a=21 where a=2; + +# slave is stopped + +let $slave_sql_errno= 1213, 1205; +source include/wait_for_slave_sql_error.inc; + +##source include/wait_for_slave_sql_to_stop.inc; + +rollback; + source include/start_slave.inc; -# cleanup +connection master; + +# recovery is proved +sync_slave_with_master; +#connection slave; + + +# +# Skipping works with Parallel slave +# + +connection slave; +stop slave sql_thread; +set @@global.sql_slave_skip_counter=7; + +connection master; + +# the following creates 8 events +begin; +select max(a) + 1 from t1 into @a; +insert into t1 set a=@a; +commit; +begin; +select max(a) + 1 from t1 into @a; +insert into t1 set a=@a; +commit; + +# which will force to skip the two above transactions by the slave +# And the third will be executed: + +begin; +select max(a) + 1 from t1 into @a; +insert into t1 set a=@a; +commit; + +connection slave; + +set @save.slave_transaction_retries= @@global.slave_transaction_retries; +set @@global.slave_transaction_retries= 1; # must cause a warning +start slave sql_thread; + +connection master; +let $a=`select max(a) from t1`; + +sync_slave_with_master; +#connection slave; + +if (`select $a - max(a) from t1`) +{ + eval select $a as 'max(a) from t1 on master'; + eval select max(a) as 'max(a) from t1 on slave' from t1; + --die Wrong skipping logics or a flaw in the test +} + +# +# UNTIL condition is not supported by Parallel slave to reject +# with a warning and no Worker thread is started +# + +connection slave; +source include/stop_slave.inc; + +connection master; +create table t2 (a int); +let $master_log_file= query_get_value(SHOW MASTER STATUS, File, 1); +let $master_log_pos= query_get_value(SHOW MASTER STATUS, Position, 1); + +insert into t2 values (1); + +connection slave; +eval start slave until master_log_file='$master_log_file', master_log_pos=$master_log_pos; + +source include/wait_for_slave_sql_to_stop.inc; +if (`select count(*) from t2`) +{ + select count(*) from t2; + --die Wrong UNTIL condtion handling or a flaw in the test +} + +source include/start_slave.inc; + +## +# cleanup +## connection master; drop table t1; +drop table t2m; +drop table t2; sync_slave_with_master; #connection slave; @@ -113,6 +263,6 @@ sync_slave_with_master; drop view worker_proc_list; drop view coord_proc_list; set @@global.slave_parallel_workers= @save.slave_parallel_workers; - +set @@global.slave_transaction_retries= @save.slave_transaction_retries; --echo end of the tests === modified file 'sql/rpl_rli_pdb.cc' --- a/sql/rpl_rli_pdb.cc 2010-12-10 15:50:03 +0000 +++ b/sql/rpl_rli_pdb.cc 2010-12-11 19:00:47 +0000 @@ -172,6 +172,9 @@ bool Slave_worker::commit_positions(Log_ my_free(ptr_g->checkpoint_log_name); ptr_g->checkpoint_log_name= NULL; + + // TODO: reset the current bitmap + } // TODO: update the group bitmap ptr_g->checkpoint_seqno 'th bit === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2010-12-10 16:25:27 +0000 +++ b/sql/rpl_slave.cc 2010-12-11 19:00:47 +0000 @@ -2855,7 +2855,8 @@ int apply_event_and_update_pos(Log_event See sql/rpl_rli.h for further details. */ int error= 0; - if (!rli->is_parallel_exec() || + if (skip_event || + !rli->is_parallel_exec() || ev->only_sequential_exec(rli->run_query_in_parallel, ev->ends_group() ? rli->curr_group_is_parallel : @@ -4389,6 +4390,14 @@ pthread_handler_t handle_slave_sql(void goto err; } THD_CHECK_SENTRY(thd); + + /* + TODO: Alfranio, to settle invocation point. It's moved to possibly + please an assert in the following block + */ + if (rli->is_parallel_exec() && mts_recovery_routine(rli)) + goto err; + #ifndef DBUG_OFF { char llbuf1[22], llbuf2[22]; @@ -4432,10 +4441,6 @@ log '%s' at position %s, relay log '%s' goto err; } - /* This is a temporary fix for the recovery routine */ - if (rli->is_parallel_exec() && mts_recovery_routine(rli)) - goto err; - /* execute init_slave variable */ if (opt_init_slave.length) { @@ -6441,13 +6446,25 @@ int start_slave(THD* thd , Master_info* if (mi->rli->slave_parallel_workers != 0) { mi->rli->slave_parallel_workers= 0; - push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, - ER_NO_UNTIL_COND_WITH_PARALLEL_SLAVE, - ER(ER_NO_UNTIL_COND_WITH_PARALLEL_SLAVE)); + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, + ER_NO_FEATURE_ON_PARALLEL_SLAVE, + ER(ER_NO_FEATURE_ON_PARALLEL_SLAVE), + "UNTIL condtion", + "Slave is started in the sequential execution mode."); } } mysql_mutex_unlock(&mi->rli->data_lock); + + /* MTS technical limitation no support of trans retry */ + if (mi->rli->slave_parallel_workers != 0 && slave_trans_retries != 0) + { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, + ER_NO_FEATURE_ON_PARALLEL_SLAVE, + ER(ER_NO_FEATURE_ON_PARALLEL_SLAVE), + "Temporary failed transaction retry", + "Such failure will force the slave to stop."); + } } else if (thd->lex->mi.pos || thd->lex->mi.relay_log_pos) push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE, ER_UNTIL_COND_IGNORED, === modified file 'sql/share/errmsg-utf8.txt' --- a/sql/share/errmsg-utf8.txt 2010-12-08 00:33:48 +0000 +++ b/sql/share/errmsg-utf8.txt 2010-12-11 19:00:47 +0000 @@ -6451,5 +6451,5 @@ ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE eng "Replication event checksum verification failed while reading from a log file." -ER_NO_UNTIL_COND_WITH_PARALLEL_SLAVE - eng "Until condition is not supported in Parallel Slave. Slave is started in the sequential mode." +ER_NO_FEATURE_ON_PARALLEL_SLAVE + eng "%s is not supported in Parallel Slave. %s" === modified file 'sql/sys_vars.cc' --- a/sql/sys_vars.cc 2010-12-10 16:25:27 +0000 +++ b/sql/sys_vars.cc 2010-12-11 19:00:47 +0000 @@ -3106,11 +3106,11 @@ static Sys_var_uint Sys_sync_relayloginf VALID_RANGE(0, UINT_MAX), DEFAULT(0), BLOCK_SIZE(1)); static Sys_var_uint Sys_checkpoint_mts_period( - "mts_checkpoint_period", "Gather workers' activities and synchronously " - "flush relay log info to disk after every #th mili-seconds. Use 0 " - "(default) to disable checkpoint", + "mts_checkpoint_period", "Gather workers' activities to " + "flush the relay log info to disk after every #th milli-seconds. " + "The zero value disables the checkpoint routine (makes sense for debugging).", GLOBAL_VAR(mts_checkpoint_period), CMD_LINE(REQUIRED_ARG), - VALID_RANGE(0, UINT_MAX), DEFAULT(0), BLOCK_SIZE(1)); + VALID_RANGE(0, UINT_MAX), DEFAULT(300), BLOCK_SIZE(1)); #endif static Sys_var_uint Sys_sync_binlog_period( --===============0754779704== 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/WL/mysql-next-\ # mr-wl5569/ # testament_sha1: 275eb4df58e47fc6d02a6051a9c05be086c10f25 # timestamp: 2010-12-11 21:01:35 +0200 # base_revision_id: andrei.elkin@stripped\ # 3rrmlpigndb4fu6i # # Begin bundle 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 --===============0754779704==--