From: Andrei Elkin Date: June 14 2011 6:24pm Subject: bzr push into mysql-next-mr-wl5569 branch (andrei.elkin:3288 to 3289) WL#5569 WL#5754 List-Archive: http://lists.mysql.com/commits/139199 Message-Id: <201106141824.p5EIOTwo022331@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0491877403==" --===============0491877403== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3289 Andrei Elkin 2011-06-14 wl#5569 MTS wl#5754 Query event parallel execution Fixing failing tests and a failure in gathering accessed databases that was caused by a recent merge from trunk. @ mysql-test/suite/rpl/r/rpl_parallel_multi_db.result results updated. @ mysql-test/suite/rpl/r/rpl_parallel_seconds_behind_master.result results updated. @ mysql-test/suite/rpl/r/rpl_parallel_start_stop.result results updated. @ mysql-test/suite/rpl/t/rpl_parallel_multi_db.test moving mtr.add_supp to eliminate possibility of warning in the slave's error; adding graceful termination lines the test. @ mysql-test/suite/rpl/t/rpl_parallel_seconds_behind_master.test moving mtr.add_supp to eliminate possibility of warning in the slave's error. @ mysql-test/suite/rpl/t/rpl_parallel_start_stop.test Suppression are added for errors that are expected by test logics; adding graceful termination lines the test. @ sql/log_event.cc fixing the last argument to report() which should be c-string; fixing gathering of db:s on the master side. Because of a query can be preceeded in binlog by engineered BEGIN (the current pattern of logging from the trunk) resetting in Query::write() can't be any longer. However another reset point exists at the end of the top-level query and that suffices. @ sql/rpl_rli.h is_mts_in_group() to mimic STS' is_in_group() is added though semantics are different. @ sql/rpl_slave.cc further cleanup in sql_slave_killed() as requested by reviewers. modified: mysql-test/suite/rpl/r/rpl_parallel_multi_db.result mysql-test/suite/rpl/r/rpl_parallel_seconds_behind_master.result mysql-test/suite/rpl/r/rpl_parallel_start_stop.result mysql-test/suite/rpl/t/rpl_parallel_multi_db.test mysql-test/suite/rpl/t/rpl_parallel_seconds_behind_master.test mysql-test/suite/rpl/t/rpl_parallel_start_stop.test sql/log_event.cc sql/rpl_rli.h sql/rpl_slave.cc 3288 Andrei Elkin 2011-06-14 [merge] merge from trunk modified: mysql-test/suite/funcs_1/r/is_columns_mysql_embedded.result mysql-test/suite/funcs_1/r/is_statistics_mysql_embedded.result mysql-test/suite/funcs_1/r/is_table_constraints_mysql_embedded.result mysql-test/suite/funcs_1/r/is_tables_mysql_embedded.result sql/rpl_info.cc sql/rpl_info.h sql/rpl_mi.cc sql/rpl_mi.h sql/rpl_rli.cc sql/rpl_rli.h sql/rpl_rli_pdb.cc sql/rpl_rli_pdb.h sql/rpl_slave.cc === modified file 'mysql-test/suite/rpl/r/rpl_parallel_multi_db.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_multi_db.result 2011-05-30 10:05:07 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_multi_db.result 2011-06-14 18:23:13 +0000 @@ -369,3 +369,5 @@ include/diff_tables.inc [master:d3.t1, s include/diff_tables.inc [master:d2.t1, slave:d2.t1] include/diff_tables.inc [master:d1.t1, slave:d1.t1] set @@global.mts_slave_parallel_workers= @save.mts_slave_parallel_workers; +include/rpl_end.inc +end of the tests === modified file 'mysql-test/suite/rpl/r/rpl_parallel_seconds_behind_master.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_seconds_behind_master.result 2011-06-10 08:04:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_seconds_behind_master.result 2011-06-14 18:23:13 +0000 @@ -1,6 +1,5 @@ include/master-slave.inc [connection master] -call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT'); include/stop_slave.inc set @save.mts_slave_parallel_workers= @@global.mts_slave_parallel_workers; set @@global.mts_slave_parallel_workers= 4; === modified file 'mysql-test/suite/rpl/r/rpl_parallel_start_stop.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_start_stop.result 2011-02-27 17:35:25 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_start_stop.result 2011-06-14 18:23:13 +0000 @@ -1,5 +1,7 @@ include/master-slave.inc [connection master] +call mtr.add_suppression('Slave SQL: Could not execute Write_rows event on table test.t1'); +call mtr.add_suppression('Slave SQL: Could not execute Update_rows event on table test.t1; Deadlock found when trying to get lock'); create view worker_proc_list as SELECT id from Information_Schema.processlist where state like 'Waiting for an event from sql thread%'; create view coord_proc_list as SELECT id from Information_Schema.processlist where state like 'Slave has read all relay log%'; @@ -56,17 +58,17 @@ set @save.slave_transaction_retries= @@g set @@global.slave_transaction_retries= 1; start slave sql_thread; Warnings: -Note 1726 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. +Note 1737 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=MASTER_LOG_POS; Warnings: -Note 1726 UNTIL condtion is not supported in Parallel Slave. Slave is started in the sequential execution mode. +Note 1737 UNTIL condtion is not supported in Parallel Slave. Slave is started in the sequential execution mode. include/wait_for_slave_sql_to_stop.inc include/start_slave.inc Warnings: -Note 1726 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. +Note 1737 Temporary failed transaction retry is not supported in Parallel Slave. Such failure will force the slave to stop. drop table t1; drop table t2m; drop table t2; @@ -74,5 +76,5 @@ drop view worker_proc_list; drop view coord_proc_list; set @@global.mts_slave_parallel_workers= @save.mts_slave_parallel_workers; set @@global.slave_transaction_retries= @save.slave_transaction_retries; -end of the tests include/rpl_end.inc +end of the tests === modified file 'mysql-test/suite/rpl/t/rpl_parallel_multi_db.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_multi_db.test 2011-05-24 14:29:35 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_multi_db.test 2011-06-14 18:23:13 +0000 @@ -8,10 +8,6 @@ --source include/master-slave.inc --source include/have_binlog_format_statement.inc ---disable_query_log -call mtr.add_suppression('.*Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.*'); ---enable_query_log - # restart in Parallel let $workers= 4; @@ -34,6 +30,10 @@ let $queries= `select $dbs*$tables * 4`; connection master; +--disable_query_log +call mtr.add_suppression('.*Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.*'); +--enable_query_log + # create & populate let $n= $dbs; @@ -349,4 +349,6 @@ sync_slave_with_master; set @@global.mts_slave_parallel_workers= @save.mts_slave_parallel_workers; -### TODO: --source include/rpl_end.inc +--source include/rpl_end.inc + +--echo end of the tests === modified file 'mysql-test/suite/rpl/t/rpl_parallel_seconds_behind_master.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_seconds_behind_master.test 2011-06-12 17:36:17 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_seconds_behind_master.test 2011-06-14 18:23:13 +0000 @@ -16,8 +16,6 @@ # on SHOW PROCESS LIST output in some of the tests) -- source include/have_binlog_format_statement.inc -# todo: sleep() is deterministic!!! -call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT'); # restart slave in MTS mode connection slave; @@ -48,6 +46,11 @@ source include/wait_for_slave_io_to_star connection master; +--disable_query_log +# todo: sleep() is deterministic!!! +call mtr.add_suppression('.*Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.*'); +--enable_query_log + create table t1 (f1 int) engine=innodb; create table t2 (f1 int) engine=innodb; save_master_pos; === modified file 'mysql-test/suite/rpl/t/rpl_parallel_start_stop.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_start_stop.test 2011-05-16 19:43:58 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_start_stop.test 2011-06-14 18:23:13 +0000 @@ -13,6 +13,9 @@ connection slave; +call mtr.add_suppression('Slave SQL: Could not execute Write_rows event on table test.t1'); +call mtr.add_suppression('Slave SQL: Could not execute Update_rows event on table test.t1; Deadlock found when trying to get lock'); + create view worker_proc_list as SELECT id from Information_Schema.processlist where state like 'Waiting for an event from sql thread%'; create view coord_proc_list as SELECT id from Information_Schema.processlist where state like 'Slave has read all relay log%'; @@ -271,7 +274,7 @@ drop view worker_proc_list; drop view coord_proc_list; set @@global.mts_slave_parallel_workers= @save.mts_slave_parallel_workers; set @@global.slave_transaction_retries= @save.slave_transaction_retries; ---echo end of the tests -### TODO: restore --source include/rpl_end.inc ---echo include/rpl_end.inc +--source include/rpl_end.inc + +--echo end of the tests === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2011-06-14 09:27:38 +0000 +++ b/sql/log_event.cc 2011-06-14 18:23:13 +0000 @@ -2412,6 +2412,7 @@ Slave_worker *Log_event::get_slave_worke int num_dbs= 0; Slave_worker *ret_worker= NULL; THD *thd= rli->info_thd; + char llbuff[22]; /* checking partioning properties and perform corresponding actions */ @@ -2497,6 +2498,7 @@ Slave_worker *Log_event::get_slave_worke &mts_assigned_partitions[i], TRUE, ret_worker))) { + llstr(rli->get_event_relay_log_pos(), llbuff); rli->report(ERROR_LEVEL, ER_MTS_CANT_PARALLEL, ER(ER_MTS_CANT_PARALLEL), get_type_str(), rli->get_event_relay_log_name(), @@ -2554,11 +2556,12 @@ Slave_worker *Log_event::get_slave_worke get_type_code() == APPEND_BLOCK_EVENT)) { DBUG_ASSERT(!ret_worker); - + + llstr(rli->get_event_relay_log_pos(), llbuff); rli->report(ERROR_LEVEL, ER_MTS_CANT_PARALLEL, ER(ER_MTS_CANT_PARALLEL), get_type_str(), rli->get_event_relay_log_name(), - rli->get_event_relay_log_pos()); + llbuff); return ret_worker; } @@ -2896,11 +2899,13 @@ int Log_event::apply_event(Relay_log_inf */ if (rli->curr_group_da.elements > 0) { + char llbuff[22]; /* Possible reason is a old version binlog sequential event wrappped with BEGIN/COMMIT or preceeded by User|Int|Random- var. MTS has to stop to suggest restart in the permanent sequential mode. */ + llstr(c_rli->get_event_relay_log_pos(), llbuff); rli->report(ERROR_LEVEL, ER_MTS_CANT_PARALLEL, ER(ER_MTS_CANT_PARALLEL), get_type_str(), c_rli->get_event_relay_log_name(), @@ -3468,7 +3473,6 @@ bool Query_log_event::write(IO_CACHE* fi start += strlen(db_name) + 1; } } - thd->clear_binlog_accessed_db_names(); } /* === modified file 'sql/rpl_rli.h' --- a/sql/rpl_rli.h 2011-06-14 10:35:20 +0000 +++ b/sql/rpl_rli.h 2011-06-14 18:23:13 +0000 @@ -531,6 +531,16 @@ public: } /** + returns true if Coordinator is scheduling events belonging to + the same group and has not reached yet its terminal event. + */ + inline bool is_mts_in_group() + { + return is_parallel_exec() && + mts_group_status == MTS_IN_GROUP; + } + + /** While a group is executed by a Worker the relay log can change. Coordinator notifies Workers about this event. Worker is supposed to commit to the recovery table with the new info. === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2011-06-14 10:35:20 +0000 +++ b/sql/rpl_slave.cc 2011-06-14 18:23:13 +0000 @@ -1023,14 +1023,14 @@ static bool io_slave_killed(THD* thd, Ma The function analyzes a possible killed status and makes a decision whether to accept it or not. Normally upon accepting the sql thread goes to shutdown. - In the event of deffering decision @rli->last_event_start_time waiting + In the event of deferring decision @rli->last_event_start_time waiting timer is set to force the killed status be accepted upon its expiration. - Notice Multi-Threaded-Slave behaives similarly in that when it's being + Notice Multi-Threaded-Slave behaves similarly in that when it's being stopped and the current group of assigned events has not yet scheduled - completely, Coordinator deferres to accept to leave its read-distribute + completely, Coordinator defers to accept to leave its read-distribute state. The above timeout ensures waiting won't last endlessly, and in - such case an error is repoted. + such case an error is reported. @param thd pointer to a THD instance @param rli pointer to Relay_log_info instance @@ -1049,8 +1049,12 @@ static bool sql_slave_killed(THD* thd, R DBUG_ASSERT(rli->slave_running == 1); if (abort_loop || thd->killed || rli->abort_slave) { - if ((is_parallel_group= (rli->is_parallel_exec() && - rli->mts_group_status == Relay_log_info::MTS_IN_GROUP)) + /* + Slave can execute stop being in one of two MTS or Single-Threaded mode. + The modes define different criteria to accept the stop. + In particular that relates to the concept of groupping. + */ + if ((is_parallel_group= rli->is_mts_in_group()) || (!rli->is_parallel_exec() && thd->transaction.all.cannot_safely_rollback() && rli->is_in_group())) @@ -1074,7 +1078,8 @@ static bool sql_slave_killed(THD* thd, R if (rli->abort_slave) { DBUG_PRINT("info", ("Request to stop slave SQL Thread received while " - "applying a group that has non-transactional " + "applying an MTS group or a group that " + "has non-transactional " "changes; waiting for completion of the group ... ")); /* @@ -1104,8 +1109,8 @@ static bool sql_slave_killed(THD* thd, R "applying a group that has non-transactional " "changes; waiting for completion of the group ... " : - "Coordinator thread of multi-threaded slave is being stopped " - "in the middle of assigning a group of events; " + "Coordinator thread of multi-threaded slave is being " + "stopped in the middle of assigning a group of events; " "deferring to exit until the group completion ... "); } else @@ -5900,7 +5905,10 @@ static Log_event* next_event(Relay_log_i */ /* shows zero while it is sleeping (and until the next event - is about to be executed) */ + is about to be executed). + Note, in MTS case Seconds_Behind_Master resetting follows + slightly different schema where reaching EOF is not enough. + */ if (!rli->is_parallel_exec()) rli->last_master_timestamp= 0; @@ -5986,6 +5994,7 @@ static Log_event* next_event(Relay_log_i mysql_mutex_unlock(log_lock); mts_checkpoint_routine(rli, period, FALSE, FALSE); // TODO: ALFRANIO ERROR mysql_mutex_lock(log_lock); + // More to the empty relay-log all assigned events done so reset it. if (rli->gaq->empty()) rli->last_master_timestamp= 0; --===============0491877403== 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: 969b10244b9f84842e45fcd45d7a5e5dcac626ca # timestamp: 2011-06-14 21:24:29 +0300 # source_branch: file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk/ # base_revision_id: andrei.elkin@stripped\ # j8na6paqtqhx33w0 # # Begin bundle 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 --===============0491877403==--