From: Andrei Elkin Date: November 21 2011 7:51pm Subject: bzr push into mysql-trunk branch (andrei.elkin:3630) List-Archive: http://lists.mysql.com/commits/142104 Message-Id: <201111211951.pALJpvHN023894@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3630 Andrei Elkin 2011-11-21 [merge] merge from the main repo. modified: storage/innobase/srv/srv0start.c === modified file 'mysql-test/suite/rpl/r/rpl_parallel_ddl.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_ddl.result 2011-11-19 08:08:03 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_ddl.result 2011-11-21 19:50:04 +0000 @@ -1005,747 +1005,5 @@ t7.frm t8.MYD t8.MYI t8.frm -"database d32:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d31:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t4.MYD -t4.MYI -t4.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d30:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d29:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d28:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d27:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d26:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d25:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d24:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d23:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d22:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d21:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d20:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d19:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d18:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d17:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d16:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d15:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d14:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d13:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d12:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d11:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d10:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d9:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d8:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d7:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d6:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d5:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d4:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d3:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d2:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm -"database d1:" -db.opt -t1.MYD -t1.MYI -t1.frm -t2.MYD -t2.MYI -t2.frm -t3.MYD -t3.MYI -t3.frm -t4.MYD -t4.MYI -t4.frm -t5.MYD -t5.MYI -t5.frm -t6.MYD -t6.MYI -t6.frm -t7.MYD -t7.MYI -t7.frm -t8.MYD -t8.MYI -t8.frm set @@global.slave_parallel_workers= @save.slave_parallel_workers; include/rpl_end.inc === added file 'mysql-test/suite/rpl/r/rpl_parallel_load_data.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_load_data.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_load_data.result 2011-11-21 17:46:02 +0000 @@ -0,0 +1,22 @@ +include/master-slave.inc +[connection master] +include/stop_slave.inc +SET @save_slave_parallel_workers= @@slave_parallel_workers; +SET @@global.slave_parallel_workers=4; +include/start_slave.inc +DROP DATABASE IF EXISTS db1; +DROP DATABASE IF EXISTS db2; +CREATE DATABASE db1; +CREATE DATABASE db2; +CREATE TABLE db1.tb1 (f1 int) ENGINE=MyISAM; +CREATE TABLE db2.tb2 (f1 int) ENGINE=InnoDB; +CREATE TRIGGER db1.tr AFTER INSERT ON tb1 FOR EACH ROW INSERT INTO db2.tb2 +(f1) VALUES (new.f1); +LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/load_bug12982188.txt' INTO TABLE db1.tb1; +SELECT COUNT(*) FROM db2.tb2; +COUNT(*) +10 +DROP DATABASE db1; +DROP DATABASE db2; +include/stop_slave.inc +SET @@global.slave_parallel_workers= @save_slave_parallel_workers; === modified file 'mysql-test/suite/rpl/t/rpl_parallel_ddl.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_ddl.test 2011-10-13 12:12:19 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_ddl.test 2011-11-21 19:50:04 +0000 @@ -252,25 +252,74 @@ while ($n) connection master; +let $n= $dbs; --disable_query_log -let $n= $dbs; +# Hunting after bug#13033076: to drop db:s on master concurrently as +# well through 4 connections. + +--connect(con1, localhost, root,,) +--connect(con2, localhost, root,,) +--connect(con3, localhost, root,,) +--connect(con4, localhost, root,,) + +let $reap_not_done= 0; + while ($n) { - # DEBUG (to remove) bug#13033076 - --connection slave - --echo "database d$n:" - --list_files $MYSQLD_DATADIR/d$n - - --connection master - eval drop database d$n; - sync_slave_with_master; + --connection con1 + if ($reap_not_done) + { + --reap + } + --send_eval drop database d$n; + dec $n; + + --connection con2 + if ($reap_not_done) + { + --reap + } + --send_eval drop database d$n; dec $n; + + --connection con3 + if ($reap_not_done) + { + --reap + } + --send_eval drop database d$n; + dec $n; + + --connection con4 + if ($reap_not_done) + { + --reap + } + --send_eval drop database d$n; + dec $n; + let $reap_not_done= 1; } --enable_query_log ---connection master + --connection con1 + --reap + --disconnect con1 + + --connection con2 + --reap + --disconnect con2 + + --connection con3 + --reap + --disconnect con3 + + --connection con4 + --reap + --disconnect con4 + +connection master; sync_slave_with_master; set @@global.slave_parallel_workers= @save.slave_parallel_workers; === added file 'mysql-test/suite/rpl/t/rpl_parallel_load_data-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_parallel_load_data-slave.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_load_data-slave.opt 2011-11-21 17:46:02 +0000 @@ -0,0 +1 @@ +--slave-transaction-retries=0 === added file 'mysql-test/suite/rpl/t/rpl_parallel_load_data.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_load_data.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_load_data.test 2011-11-21 17:46:02 +0000 @@ -0,0 +1,53 @@ +# +# Bug#12982188 MTS: SBR ABORTS WITH ERROR 1742 ON LOAD DATA WITH TRIGGER MYISAM TO INNODB +# + +--source include/master-slave.inc +--source include/have_binlog_format_statement.inc + +let $max_workers= 4; + +--write_file $MYSQLTEST_VARDIR/load_bug12982188.txt +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +EOF + +--connection slave +--source include/stop_slave.inc +SET @save_slave_parallel_workers= @@slave_parallel_workers; +eval SET @@global.slave_parallel_workers=$max_workers; +--source include/start_slave.inc + +--connection master +--disable_warnings +DROP DATABASE IF EXISTS db1; +DROP DATABASE IF EXISTS db2; +--enable_warnings +CREATE DATABASE db1; +CREATE DATABASE db2; +CREATE TABLE db1.tb1 (f1 int) ENGINE=MyISAM; +CREATE TABLE db2.tb2 (f1 int) ENGINE=InnoDB; +CREATE TRIGGER db1.tr AFTER INSERT ON tb1 FOR EACH ROW INSERT INTO db2.tb2 +(f1) VALUES (new.f1); +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/load_bug12982188.txt' INTO TABLE db1.tb1; +--sync_slave_with_master +SELECT COUNT(*) FROM db2.tb2; + +# cleanup +--connection master +DROP DATABASE db1; +DROP DATABASE db2; +--remove_file $MYSQLTEST_VARDIR/load_bug12982188.txt + +--sync_slave_with_master +--source include/stop_slave.inc +SET @@global.slave_parallel_workers= @save_slave_parallel_workers; === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2011-11-21 13:25:04 +0000 +++ b/sql/log_event.cc 2011-11-21 17:46:02 +0000 @@ -2367,12 +2367,48 @@ Log_event::continue_group(Relay_log_info return Log_event::do_shall_skip(rli); } - -bool Log_event::contains_partition_info() +/** + @param end_group_sets_max_dbs when true the group terminal event + can carry partition info, see a note below. + @return true in cases the current event + carries partition data, + false otherwise + + @note Some events combination may force to adjust partition info. + In particular BEGIN, BEGIN_LOAD_QUERY_EVENT, COMMIT + where none of the events holds partitioning data + causes the sequential applying of the group through + assigning OVER_MAX_DBS_IN_EVENT_MTS to mts_accessed_dbs + of COMMIT query event. +*/ +bool Log_event::contains_partition_info(bool end_group_sets_max_dbs) { - return (get_type_code() == TABLE_MAP_EVENT) || - (get_type_code() == QUERY_EVENT && !ends_group() && !starts_group()) || - (get_type_code() == EXECUTE_LOAD_QUERY_EVENT); + bool res; + + switch (get_type_code()) { + case TABLE_MAP_EVENT: + case EXECUTE_LOAD_QUERY_EVENT: + res= true; + + break; + + case QUERY_EVENT: + if (ends_group() && end_group_sets_max_dbs) + { + res= true; + static_cast(this)->mts_accessed_dbs= + OVER_MAX_DBS_IN_EVENT_MTS; + } + else + res= (!ends_group() && !starts_group()) ? true : false; + + break; + + default: + res= false; + } + + return res; } /** @@ -2459,27 +2495,44 @@ Slave_worker *Log_event::get_slave_worke { Log_event *ptr_curr_ev= this; // B-event is appended to the Deferred Array associated with GCAP - insert_dynamic(&rli->curr_group_da, - (uchar*) &ptr_curr_ev); + insert_dynamic(&rli->curr_group_da, (uchar*) &ptr_curr_ev); DBUG_ASSERT(rli->curr_group_da.elements == 1); // mark the current group as started with explicit B-event rli->curr_group_seen_begin= TRUE; - + // pessimistic preparation of no db:s will be found in events + rli->mts_end_group_sets_max_dbs= true; return ret_worker; } } // mini-group representative - if (contains_partition_info()) + if (contains_partition_info(rli->mts_end_group_sets_max_dbs)) { int i= 0; num_dbs= mts_number_dbs(); List_iterator it(*get_mts_dbs(&rli->mts_coor_mem_root)); it++; + /* + Bug 12982188 - MTS: SBR ABORTS WITH ERROR 1742 ON LOAD DATA + Logging on master can create a group with no events holding + the partition info. + The following assert proves there's the only reason + for such group. + */ + DBUG_ASSERT(!ends_group() || + (rli->mts_end_group_sets_max_dbs && + rli->curr_group_da.elements == 2 && + ((*(Log_event **) + dynamic_array_ptr(&rli->curr_group_da, + rli->curr_group_da.elements - 1))-> + get_type_code() == BEGIN_LOAD_QUERY_EVENT))); + + // partioning info is found which drops the flag + rli->mts_end_group_sets_max_dbs= false; ret_worker= rli->last_assigned_worker; if (num_dbs == OVER_MAX_DBS_IN_EVENT_MTS) { @@ -2782,7 +2835,16 @@ int Log_event::apply_event(Relay_log_inf DBUG_ASSERT(actual_exec_mode == EVENT_EXEC_PARALLEL); DBUG_ASSERT(!(rli->curr_group_seen_begin && ends_group()) || - rli->last_assigned_worker); + rli->last_assigned_worker || + /* + Begin_load_query can be logged w/o db info and within + Begin/Commit. That's a pattern forcing sequential + applying of LOAD-DATA. + */ + (*(Log_event **) + dynamic_array_ptr(&rli->curr_group_da, + rli->curr_group_da.elements - 1))-> + get_type_code() == BEGIN_LOAD_QUERY_EVENT); worker= NULL; rli->mts_group_status= Relay_log_info::MTS_IN_GROUP; @@ -3987,10 +4049,10 @@ void Query_log_event::print(FILE* file, */ void Query_log_event::attach_temp_tables_worker(THD *thd) { - if (!is_mts_worker(thd) || !contains_partition_info()) + if (!is_mts_worker(thd) || (ends_group() || starts_group())) return; - // in over max-db:s case just one special parttion is locked + // in over max-db:s case just one special partition is locked int parts= ((mts_accessed_dbs == OVER_MAX_DBS_IN_EVENT_MTS) ? 1 : mts_accessed_dbs); === modified file 'sql/log_event.h' --- a/sql/log_event.h 2011-11-15 13:04:11 +0000 +++ b/sql/log_event.h 2011-11-21 17:46:02 +0000 @@ -1405,7 +1405,7 @@ public: /** @return TRUE if events carries partitioning data (database names). */ - bool contains_partition_info(); + bool contains_partition_info(bool); /* @return the number of updated by the event databases. === modified file 'sql/rpl_rli.h' --- a/sql/rpl_rli.h 2011-11-15 13:04:11 +0000 +++ b/sql/rpl_rli.h 2011-11-21 17:46:02 +0000 @@ -448,6 +448,7 @@ public: DYNAMIC_ARRAY curr_group_da; // deferred array to hold partition-info-free events bool curr_group_seen_begin; // current group started with B-event or not bool curr_group_isolated; // current group requires execution in isolation + bool mts_end_group_sets_max_dbs; // flag indicates if partitioning info is discovered volatile ulong mts_wq_underrun_w_id; // Id of a Worker whose queue is getting empty /* Ongoing excessive overrun counter to correspond to number of events that === modified file 'sql/rpl_rli_pdb.cc' --- a/sql/rpl_rli_pdb.cc 2011-11-10 06:53:27 +0000 +++ b/sql/rpl_rli_pdb.cc 2011-11-21 17:46:02 +0000 @@ -129,6 +129,7 @@ int Slave_worker::init_worker(Relay_log_ workers= c_rli->workers; // shallow copying is sufficient wq_size_waits_cnt= groups_done= events_done= curr_jobs= 0; usage_partition= 0; + end_group_sets_max_dbs= false; last_group_done_index= c_rli->gaq->size; // out of range jobs.avail= 0; @@ -1686,11 +1687,13 @@ int slave_worker_exec_job(Slave_worker * if (ev->starts_group()) { + worker->end_group_sets_max_dbs= true; worker->curr_group_seen_begin= TRUE; // The current group is started with B-event } else { - if ((part_event= ev->contains_partition_info())) + if ((part_event= + ev->contains_partition_info(worker->end_group_sets_max_dbs))) { uint num_dbs= ev->mts_number_dbs(); DYNAMIC_ARRAY *ep= &worker->curr_group_exec_parts; @@ -1720,6 +1723,7 @@ int slave_worker_exec_job(Slave_worker * insert_dynamic(ep, (uchar*) &ev->mts_assigned_partitions[k]); } } + worker->end_group_sets_max_dbs= false; } } worker->set_future_event_relay_log_pos(ev->future_event_relay_log_pos); === modified file 'sql/rpl_rli_pdb.h' --- a/sql/rpl_rli_pdb.h 2011-08-19 13:04:28 +0000 +++ b/sql/rpl_rli_pdb.h 2011-11-21 17:46:02 +0000 @@ -312,6 +312,8 @@ public: volatile int curr_jobs; // number of active assignments // number of partitions allocated to the worker at point in time long usage_partition; + // symmetric to rli->mts_end_group_sets_max_dbs + bool end_group_sets_max_dbs; volatile bool relay_log_change_notified; // Coord sets and resets, W can read volatile bool checkpoint_notified; // Coord sets and resets, W can read No bundle (reason: useless for push emails).