From: Andrei Elkin Date: December 2 2010 5:46pm Subject: bzr commit into mysql-next-mr.crash-safe branch (andrei.elkin:3224) WL#5569 List-Archive: http://lists.mysql.com/commits/125837 Message-Id: <201012021747.oB2Hl1us031104@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0699111287==" --===============0699111287== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/andrei/MySQL/BZR/2a-23May/WL/mysql-next-mr-wl5569/ based on revid:andrei.elkin@stripped 3224 Andrei Elkin 2010-12-02 wl#5569 MTS User interface related: set @@global.slave_parallel_workers= `non-zero` following with `START SLAVE` starts slave with so many Worker threads. That is non-zero value is defacto the slave parallel execution mode. Earlier introduced enum enum_slave_exec_mode SLAVE_EXEC_MODE_PARALLEL is withdrawn. Fixes rli->mts_pending_jobs_size statistics which might cause assert-crash otherwise. a silly c&p mistake of relay-log name change notification. Made a little clean-up including relocation of init-ion of workers related stuff into start_slave_workers(). Many changes in tests due to SLAVE_EXEC_MODE_PARALLEL and not only. @ sql/log_event.cc few asserts are motivated by a silly c&p mistake of relay-log name change notification. Fixing rli->mts_pending_jobs_size statistics which might cause assert-crash otherwise. @ sql/rpl_rli.cc relocating Worker related stuff from init at RLI constructor to the start slave workers; Intruduced a public Relay_log_info::reset_notified_relay_log_change() to call when C discovers the relay log name change (next_event). @ sql/rpl_rli.h the server @@global.slave_parallel_workers has affect only when the slave is stopped. At start the var's value is copied to rli::slave_parallel_workers and this value is in used in the slave session time. Refining is_parallel_exec() to base on the rli's value; @ sql/rpl_rli_pdb.cc Fixing a c&p bug for relay-log name; @ sql/rpl_slave.cc removing ealier intruduced extra rli->slave_worker_is_error; relocating Worker related stuff from init at RLI constructor to the start slave workers; @ sql/sql_class.h removing explicit slave exec paral mode. @ sql/sys_vars.cc changing default 4 to 0 for slave_parallel_workers. Non-zero value means so many Worker threads is launched. Conversely zero is the sequential slave execution mode. Fixing the name of the server var: mts_partition_hash_soft_max. renamed: mysql-test/suite/rpl/r/rpl_serial.result => mysql-test/suite/rpl/r/rpl_sequential.result mysql-test/suite/rpl/t/rpl_serial.test => mysql-test/suite/rpl/t/rpl_sequential.test modified: mysql-test/extra/rpl_tests/rpl_parallel_load.test mysql-test/suite/rpl/r/rpl_parallel.result mysql-test/suite/rpl/r/rpl_parallel_conf_limits.result mysql-test/suite/rpl/r/rpl_parallel_conflicts.result mysql-test/suite/rpl/r/rpl_parallel_start_stop.result mysql-test/suite/rpl/t/rpl_parallel-slave.opt mysql-test/suite/rpl/t/rpl_parallel.test mysql-test/suite/rpl/t/rpl_parallel_conf_limits.test mysql-test/suite/rpl/t/rpl_parallel_conflicts.test mysql-test/suite/rpl/t/rpl_parallel_start_stop.test sql/log_event.cc sql/mysqld.cc sql/mysqld.h sql/rpl_rli.cc sql/rpl_rli.h sql/rpl_rli_pdb.cc sql/rpl_slave.cc sql/sql_class.h sql/sys_vars.cc mysql-test/suite/rpl/r/rpl_sequential.result mysql-test/suite/rpl/t/rpl_sequential.test === modified file 'mysql-test/extra/rpl_tests/rpl_parallel_load.test' --- a/mysql-test/extra/rpl_tests/rpl_parallel_load.test 2010-11-20 17:23:42 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_parallel_load.test 2010-12-02 17:46:46 +0000 @@ -1,19 +1,13 @@ # -# This is a load generator to call from rpl_parallel and rpl_serial tests +# This is a load generator to call from rpl_parallel and rpl_sequential tests # -# concurrency parameter. -# Optimally @@global.slave_parallel_workers should be set to -# -# number of CPU:s or cores - 0|1 -# The default is 4. -# - -let $workers = `select @@global.slave_parallel_workers`; # # load volume parameter # + let $iter = 2000; +let $databases = 4; connection slave; @@ -69,7 +63,7 @@ delimiter ;| # delimiter ;| -let $i = $workers + 1; +let $i = $databases + 1; while($i) { let $i1 = $i; @@ -103,7 +97,7 @@ sync_slave_with_master; --disable_query_log --disable_result_log -let $i = $workers + 1; +let $i = $databases + 1; while($i) { let $i1 = $i; @@ -136,7 +130,7 @@ connection master; # the extra ts col on slave is effective only with the STMT format (todo: bug-report) set @save.binlog_format= @@session.binlog_format; set @@session.binlog_format=STATEMENT; -let $i = $workers + 1; +let $i = $databases + 1; while($i) { let $i1 = $i; @@ -159,7 +153,7 @@ connection master; while ($iter) { - let $i = $workers + 1; + let $i = $databases + 1; while ($i) { @@ -188,7 +182,7 @@ connection master; # terminal timestamp to record -let $i = $workers + 1; +let $i = $databases + 1; set @save.binlog_format= @@session.binlog_format; set @@session.binlog_format=STATEMENT; while($i) @@ -209,7 +203,7 @@ set @@session.binlog_format= @save.binlo connection slave; ## todo: record start and end time of appying to compare times of -# parallel and serial execution. +# parallel and sequential execution. --disable_query_log --disable_result_log @@ -243,11 +237,11 @@ select time_to_sec(@m_1) - time_to_sec(@ # debug: pre diff check-out --disable_result_log --disable_query_log -###select sleep(9999); +##select sleep(9999); --enable_result_log --enable_query_log -let $i = $workers + 1; +let $i = $databases + 1; while($i) { let $i1 = $i; @@ -266,7 +260,7 @@ while($i) # debug: pre diff check-out --disable_result_log --disable_query_log -###select sleep(9999); +##select sleep(9999); --enable_result_log --enable_query_log @@ -276,7 +270,7 @@ connection master; --disable_query_log --disable_result_log -let $i = $workers + 1; +let $i = $databases + 1; while($i) { let $i1 = $i; === modified file 'mysql-test/suite/rpl/r/rpl_parallel.result' --- a/mysql-test/suite/rpl/r/rpl_parallel.result 2010-09-17 23:40:11 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel.result 2010-12-02 17:46:46 +0000 @@ -4,11 +4,10 @@ reset master; reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; -set @save.slave_exec_mode= @@global.slave_exec_mode; -set @@global.slave_exec_mode = 'Parallel'; -select @@global.slave_exec_mode like 'Parallel' as 'one'; -one -1 +set @save.slave_parallel_workers= @@global.slave_parallel_workers; +select @@global.slave_parallel_workers as 'non-zero means parallel'; +non-zero means parallel +4 call mtr.add_suppression('Slave: Error dropping database'); include/stop_slave.inc start slave; @@ -27,4 +26,4 @@ Comparing tables master:test3.tm_nk and Comparing tables master:test2.tm_nk and slave:test2.tm_nk Comparing tables master:test1.tm_nk and slave:test1.tm_nk Comparing tables master:test0.tm_nk and slave:test0.tm_nk -set @@global.slave_exec_mode= @save.slave_exec_mode; +set @@global.slave_parallel_workers= @save.slave_parallel_workers; === modified file 'mysql-test/suite/rpl/r/rpl_parallel_conf_limits.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_conf_limits.result 2010-12-01 17:08:21 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_conf_limits.result 2010-12-02 17:46:46 +0000 @@ -6,26 +6,26 @@ drop table if exists t1,t2,t3,t4,t5,t6,t start slave; create view coord_wait_list as SELECT id from Information_Schema.processlist where state like 'Waiting for Slave Worker%'; include/stop_slave.inc -set @save.slave_exec_mode= @@global.slave_exec_mode; -set @@global.slave_exec_mode = 'Parallel'; +set @save.slave_parallel_workers= @@global.slave_parallel_workers; +set @@global.slave_parallel_workers= 4; set @save_mts_slave_worker_queue_len_max= @@global.mts_slave_worker_queue_len_max; set @@global.mts_slave_worker_queue_len_max= 5; include/start_slave.inc -create database d1; -create table d1.t1 (a int auto_increment primary key) engine=innodb; +create database d0; +create table d0.t1 (a int auto_increment primary key) engine=innodb; select sleep(2); sleep(2) 0 begin; -insert into d1.t1 set a=null; +insert into d0.t1 set a=null; begin; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; commit; *** Coordinator must be waiting a for Worker to process its queue *** rollback; @@ -34,14 +34,161 @@ include/stop_slave.inc set @save_mts_pending_jobs_size_max = @@global.mts_pending_jobs_size_max; set @@global.mts_pending_jobs_size_max= 1024; include/start_slave.inc -create table d1.t2 (a int auto_increment primary key, b text null) engine=innodb; +create table d0.t2 (a int auto_increment primary key, b text null) engine=innodb; begin; -insert into d1.t2 set a= 1; +insert into d0.t2 set a= 1; begin; commit; *** Coordinator must be waiting for Workers have released pending events mem *** rollback; set @@global.mts_pending_jobs_size_max= @save_mts_pending_jobs_size_max; +set @save.mts_partition_hash_soft_max= @@global.mts_partition_hash_soft_max; +set @@global.mts_partition_hash_soft_max= 0; +create database d16; +create table d16.t1 (a int auto_increment primary key) engine=innodb; +create database d15; +create table d15.t1 (a int auto_increment primary key) engine=innodb; +create database d14; +create table d14.t1 (a int auto_increment primary key) engine=innodb; +create database d13; +create table d13.t1 (a int auto_increment primary key) engine=innodb; +create database d12; +create table d12.t1 (a int auto_increment primary key) engine=innodb; +create database d11; +create table d11.t1 (a int auto_increment primary key) engine=innodb; +create database d10; +create table d10.t1 (a int auto_increment primary key) engine=innodb; +create database d9; +create table d9.t1 (a int auto_increment primary key) engine=innodb; +create database d8; +create table d8.t1 (a int auto_increment primary key) engine=innodb; +create database d7; +create table d7.t1 (a int auto_increment primary key) engine=innodb; +create database d6; +create table d6.t1 (a int auto_increment primary key) engine=innodb; +create database d5; +create table d5.t1 (a int auto_increment primary key) engine=innodb; +create database d4; +create table d4.t1 (a int auto_increment primary key) engine=innodb; +create database d3; +create table d3.t1 (a int auto_increment primary key) engine=innodb; +create database d2; +create table d2.t1 (a int auto_increment primary key) engine=innodb; +create database d1; +create table d1.t1 (a int auto_increment primary key) engine=innodb; +begin; +insert into d16.t1 set a=null; +insert into d16.t1 set a=null; +insert into d16.t1 set a=null; +insert into d16.t1 set a=null; +commit; +begin; +insert into d15.t1 set a=null; +insert into d15.t1 set a=null; +insert into d15.t1 set a=null; +insert into d15.t1 set a=null; +commit; +begin; +insert into d14.t1 set a=null; +insert into d14.t1 set a=null; +insert into d14.t1 set a=null; +insert into d14.t1 set a=null; +commit; +begin; +insert into d13.t1 set a=null; +insert into d13.t1 set a=null; +insert into d13.t1 set a=null; +insert into d13.t1 set a=null; +commit; +begin; +insert into d12.t1 set a=null; +insert into d12.t1 set a=null; +insert into d12.t1 set a=null; +insert into d12.t1 set a=null; +commit; +begin; +insert into d11.t1 set a=null; +insert into d11.t1 set a=null; +insert into d11.t1 set a=null; +insert into d11.t1 set a=null; +commit; +begin; +insert into d10.t1 set a=null; +insert into d10.t1 set a=null; +insert into d10.t1 set a=null; +insert into d10.t1 set a=null; +commit; +begin; +insert into d9.t1 set a=null; +insert into d9.t1 set a=null; +insert into d9.t1 set a=null; +insert into d9.t1 set a=null; +commit; +begin; +insert into d8.t1 set a=null; +insert into d8.t1 set a=null; +insert into d8.t1 set a=null; +insert into d8.t1 set a=null; +commit; +begin; +insert into d7.t1 set a=null; +insert into d7.t1 set a=null; +insert into d7.t1 set a=null; +insert into d7.t1 set a=null; +commit; +begin; +insert into d6.t1 set a=null; +insert into d6.t1 set a=null; +insert into d6.t1 set a=null; +insert into d6.t1 set a=null; +commit; +begin; +insert into d5.t1 set a=null; +insert into d5.t1 set a=null; +insert into d5.t1 set a=null; +insert into d5.t1 set a=null; +commit; +begin; +insert into d4.t1 set a=null; +insert into d4.t1 set a=null; +insert into d4.t1 set a=null; +insert into d4.t1 set a=null; +commit; +begin; +insert into d3.t1 set a=null; +insert into d3.t1 set a=null; +insert into d3.t1 set a=null; +insert into d3.t1 set a=null; +commit; +begin; +insert into d2.t1 set a=null; +insert into d2.t1 set a=null; +insert into d2.t1 set a=null; +insert into d2.t1 set a=null; +commit; +begin; +insert into d1.t1 set a=null; +insert into d1.t1 set a=null; +insert into d1.t1 set a=null; +insert into d1.t1 set a=null; +commit; +set @@global.mts_partition_hash_soft_max= @save.mts_partition_hash_soft_max; +drop database d16; +drop database d15; +drop database d14; +drop database d13; +drop database d12; +drop database d11; +drop database d10; +drop database d9; +drop database d8; +drop database d7; +drop database d6; +drop database d5; +drop database d4; +drop database d3; +drop database d2; drop database d1; +drop database d0; drop view coord_wait_list; -set @@global.slave_exec_mode= @save.slave_exec_mode; +set @@global.slave_parallel_workers= @save.slave_parallel_workers; === modified file 'mysql-test/suite/rpl/r/rpl_parallel_conflicts.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_conflicts.result 2010-12-01 17:08:21 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_conflicts.result 2010-12-02 17:46:46 +0000 @@ -6,8 +6,8 @@ drop table if exists t1,t2,t3,t4,t5,t6,t start slave; create view coord_wait_list as SELECT id from Information_Schema.processlist where state like 'Waiting for Slave Worker%'; include/stop_slave.inc -set @save.slave_exec_mode= @@global.slave_exec_mode; -set @@global.slave_exec_mode = 'Parallel'; +set @save.slave_parallel_workers= @@global.slave_parallel_workers; +set @@global.slave_parallel_workers= 4; include/start_slave.inc create database d1; create database d2; @@ -75,5 +75,5 @@ drop database d1; drop database d2; drop database d3; drop view coord_wait_list; -set @@global.slave_exec_mode= @save.slave_exec_mode; +set @@global.slave_parallel_workers= @save.slave_parallel_workers; *** End of the tests *** === modified file 'mysql-test/suite/rpl/r/rpl_parallel_start_stop.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_start_stop.result 2010-11-20 17:23:42 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_start_stop.result 2010-12-02 17:46:46 +0000 @@ -8,8 +8,8 @@ create view worker_proc_list as SELECT i 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%'; include/stop_slave.inc -set @save.slave_exec_mode= @@global.slave_exec_mode; -set @@global.slave_exec_mode = 'Parallel'; +set @save.slave_parallel_workers= @@global.slave_parallel_workers; +set @@global.slave_parallel_workers= 4; include/start_slave.inc select min(id) from worker_proc_list into @w_id; kill query @w_id; @@ -26,5 +26,5 @@ include/start_slave.inc drop table t1; drop view worker_proc_list; drop view coord_proc_list; -set @@global.slave_exec_mode= @save.slave_exec_mode; +set @@global.slave_parallel_workers= @save.slave_parallel_workers; end of the tests === renamed file 'mysql-test/suite/rpl/r/rpl_serial.result' => 'mysql-test/suite/rpl/r/rpl_sequential.result' --- a/mysql-test/suite/rpl/r/rpl_serial.result 2010-09-17 23:40:11 +0000 +++ b/mysql-test/suite/rpl/r/rpl_sequential.result 2010-12-02 17:46:46 +0000 @@ -4,10 +4,10 @@ reset master; reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; -set @@global.slave_exec_mode = default; -select @@global.slave_exec_mode not like 'Parallel' as 'one'; -one -1 +set @save.slave_parallel_workers= 0; +select @@global.slave_parallel_workers as 'zero'; +zero +0 call mtr.add_suppression('Slave: Error dropping database'); include/stop_slave.inc start slave; === modified file 'mysql-test/suite/rpl/t/rpl_parallel-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_parallel-slave.opt 2010-11-23 09:03:37 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel-slave.opt 2010-12-02 17:46:46 +0000 @@ -1 +1,2 @@ ---relay-log-info-repository=FILE +--relay-log-info-repository=FILE --slave-parallel-workers=4 + === modified file 'mysql-test/suite/rpl/t/rpl_parallel.test' --- a/mysql-test/suite/rpl/t/rpl_parallel.test 2010-09-17 23:40:11 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel.test 2010-12-02 17:46:46 +0000 @@ -2,13 +2,13 @@ # WL#5563 Prototype for Parallel Slave with db name partitioning. # # The test checks correctness of replication and is designed for -# benchmarking and comparision with results of its serial -# counterpart rpl_serial.test. +# benchmarking and comparision with results of its sequential +# counterpart rpl_sequential.test. # Both tests leave mysqld.2/data/test/delta.out file # that contains a row with two columns. # 1. the duration (in seconds) of execution on the master # 2. the duration of execution on the slave -# The 2nd column of the rpl_parallel can be compared with the 2nd of rpl_serial.test. +# The 2nd column of the rpl_parallel can be compared with the 2nd of rpl_sequential.test. # # The duration recorded in the file accounts the SQL thread/workers work. # That is benchmarking on the slave side is effectively started with @@ -28,20 +28,20 @@ # find /dev/shm/var1 -name delta.out -exec cat {} \; | cat >> delta.$slave.log; # done # -# mysql-test$ slave=serial; ... +# mysql-test$ slave=sequential; ... # -# In the end there will be mysql-test/delta.{parallel,serial}.log files. +# In the end there will be mysql-test/delta.{parallel,sequential}.log files. # source include/master-slave.inc; connection slave; -set @save.slave_exec_mode= @@global.slave_exec_mode; -set @@global.slave_exec_mode = 'Parallel'; -select @@global.slave_exec_mode like 'Parallel' as 'one'; +set @save.slave_parallel_workers= @@global.slave_parallel_workers; +select @@global.slave_parallel_workers as 'non-zero means parallel'; +let $workers = `select @@global.slave_parallel_workers`; connection master; source extra/rpl_tests/rpl_parallel_load.test; connection slave; -set @@global.slave_exec_mode= @save.slave_exec_mode; +set @@global.slave_parallel_workers= @save.slave_parallel_workers; === modified file 'mysql-test/suite/rpl/t/rpl_parallel_conf_limits.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_conf_limits.test 2010-12-01 17:08:21 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_conf_limits.test 2010-12-02 17:46:46 +0000 @@ -15,8 +15,8 @@ create view coord_wait_list as SELECT i # restart in Parallel source include/stop_slave.inc; -set @save.slave_exec_mode= @@global.slave_exec_mode; -set @@global.slave_exec_mode = 'Parallel'; +set @save.slave_parallel_workers= @@global.slave_parallel_workers; +set @@global.slave_parallel_workers= 4; # max len of WQ @@ -26,32 +26,32 @@ source include/start_slave.inc; connection master; -create database d1; -create table d1.t1 (a int auto_increment primary key) engine=innodb; +create database d0; +create table d0.t1 (a int auto_increment primary key) engine=innodb; connection slave; select sleep(2); begin; -insert into d1.t1 set a=null; # lock a row that master has inserted into +insert into d0.t1 set a=null; # lock a row that master has inserted into connection master; begin; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; -insert into d1.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; +insert into d0.t1 set a=null; commit; -let $d1_t1_count=`select count(*) from d1.t1`; +let $d0_t1_count=`select count(*) from d0.t1`; connection slave; @@ -63,8 +63,8 @@ source include/wait_until_rows_count.inc rollback; -let $count= $d1_t1_count; -let $table= d1.t1; +let $count= $d0_t1_count; +let $table= d0.t1; source include/wait_until_rows_count.inc; # cleanup of the max len @@ -85,7 +85,7 @@ eval set @@global.mts_pending_jobs_size_ source include/start_slave.inc; connection master; -create table d1.t2 (a int auto_increment primary key, b text null) engine=innodb; +create table d0.t2 (a int auto_increment primary key, b text null) engine=innodb; connection slave; @@ -97,7 +97,7 @@ select sleep(2); --enable_query_log begin; -insert into d1.t2 set a= 1; +insert into d0.t2 set a= 1; # master trans structure aims at testing C's wait loop @@ -107,23 +107,23 @@ connection master; begin; --disable_query_log - eval insert into d1.t2 set a= 1, b= REPEAT('b', 1); + eval insert into d0.t2 set a= 1, b= REPEAT('b', 1); while ($i_loop) { - eval insert into d1.t2 set b= REPEAT('b', 1); - eval insert into d1.t2 set b= REPEAT('b', 1); - eval insert into d1.t2 set b= REPEAT('b', 1); - eval insert into d1.t2 set b= REPEAT('b', 1); - eval insert into d1.t2 set b= REPEAT('b', 1); - eval insert into d1.t2 set b= REPEAT('b', 1); - eval insert into d1.t2 set b= REPEAT('b', 2* $mts_max_q_size/3); + eval insert into d0.t2 set b= REPEAT('b', 1); + eval insert into d0.t2 set b= REPEAT('b', 1); + eval insert into d0.t2 set b= REPEAT('b', 1); + eval insert into d0.t2 set b= REPEAT('b', 1); + eval insert into d0.t2 set b= REPEAT('b', 1); + eval insert into d0.t2 set b= REPEAT('b', 1); + eval insert into d0.t2 set b= REPEAT('b', 2* $mts_max_q_size/3); dec $i_loop; } --enable_query_log commit; -let $d1_t2_count=`select count(*) from d1.t2`; +let $d0_t2_count=`select count(*) from d0.t2`; connection slave; @@ -135,13 +135,77 @@ source include/wait_until_rows_count.inc rollback; -let $count= $d1_t2_count; -let $table= d1.t2; +let $count= $d0_t2_count; +let $table= d0.t2; source include/wait_until_rows_count.inc; # cleanup of the max len set @@global.mts_pending_jobs_size_max= @save_mts_pending_jobs_size_max; +# +# Number of records in the mts partition hash below which +# entries with zero usage are tolerated. +# The test ensures slave's stable execution. +# + +# force eager garbage collecting +set @save.mts_partition_hash_soft_max= @@global.mts_partition_hash_soft_max; +set @@global.mts_partition_hash_soft_max= 0; + +let $databases= 16; + +connection master; + +let $i= $databases; +while ($i) +{ + eval create database d$i; + eval create table d$i.t1 (a int auto_increment primary key) engine=innodb; + dec $i; +} + +# loading slave with $databases number of parallelizable transaction +# each leaving a dummy record after is completed on the slave + +let $i= $databases; +while ($i) +{ + begin; + eval insert into d$i.t1 set a=null; + eval insert into d$i.t1 set a=null; + eval insert into d$i.t1 set a=null; + eval insert into d$i.t1 set a=null; + commit; + + dec $i; +} + +# TODO: + +connection slave; + +--disable_query_log +--disable_result_log +select sleep(1); +--enable_result_log +--enable_query_log + +#sync_slave_with_master +set @@global.mts_partition_hash_soft_max= @save.mts_partition_hash_soft_max; + +connection master; + +let $i= $databases; +while ($i) +{ + eval drop database d$i; + dec $i; +} + + +connection slave; +#sync_slave_with_master + # # cleanup @@ -149,7 +213,7 @@ set @@global.mts_pending_jobs_size_max= connection master; -drop database d1; +drop database d0; # sync_slave_with_master @@ -159,6 +223,6 @@ drop view coord_wait_list; --sleep 2 -set @@global.slave_exec_mode= @save.slave_exec_mode; +set @@global.slave_parallel_workers= @save.slave_parallel_workers; === modified file 'mysql-test/suite/rpl/t/rpl_parallel_conflicts.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_conflicts.test 2010-12-01 17:08:21 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_conflicts.test 2010-12-02 17:46:46 +0000 @@ -46,8 +46,9 @@ create view coord_wait_list as SELECT i source include/stop_slave.inc; -set @save.slave_exec_mode= @@global.slave_exec_mode; -set @@global.slave_exec_mode = 'Parallel'; +set @save.slave_parallel_workers= @@global.slave_parallel_workers; +set @@global.slave_parallel_workers= 4; + source include/start_slave.inc; @@ -61,6 +62,7 @@ create table d2.t1 (a int auto_increment create table d3.t1 (a int auto_increment primary key) engine=innodb; # + # I. Two parallel jobs conflict # # two conflicting jobs to follow @@ -214,7 +216,7 @@ connection slave; #sync_slave_with_master; drop view coord_wait_list; -set @@global.slave_exec_mode= @save.slave_exec_mode; +set @@global.slave_parallel_workers= @save.slave_parallel_workers; --echo *** 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-11-25 08:47:39 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_start_stop.test 2010-12-02 17:46:46 +0000 @@ -15,8 +15,9 @@ create view coord_proc_list as SELECT i source include/stop_slave.inc; -set @save.slave_exec_mode= @@global.slave_exec_mode; -set @@global.slave_exec_mode = 'Parallel'; +set @save.slave_parallel_workers= @@global.slave_parallel_workers; +set @@global.slave_parallel_workers= 4; + source include/start_slave.inc; let $count= `select @@global.slave_parallel_workers`; @@ -138,7 +139,7 @@ connection slave; drop view worker_proc_list; drop view coord_proc_list; -set @@global.slave_exec_mode= @save.slave_exec_mode; +set @@global.slave_parallel_workers= @save.slave_parallel_workers; --echo end of the tests === renamed file 'mysql-test/suite/rpl/t/rpl_serial.test' => 'mysql-test/suite/rpl/t/rpl_sequential.test' --- a/mysql-test/suite/rpl/t/rpl_serial.test 2010-09-17 23:40:11 +0000 +++ b/mysql-test/suite/rpl/t/rpl_sequential.test 2010-12-02 17:46:46 +0000 @@ -1,7 +1,7 @@ # # WL#5563 Prototype for Parallel Slave with db name partitioning. # -# The test can be used for benchmarking and comparision with its serial +# The test can be used for benchmarking and comparision with its sequential # counterpart rpl_parallel.test. Read more comments in there. # @@ -9,8 +9,8 @@ source include/master-slave.inc; connection slave; -set @@global.slave_exec_mode = default; -select @@global.slave_exec_mode not like 'Parallel' as 'one'; +set @save.slave_parallel_workers= 0; +select @@global.slave_parallel_workers as 'zero'; connection master; === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2010-12-01 17:08:21 +0000 +++ b/sql/log_event.cc 2010-12-02 17:46:46 +0000 @@ -2218,6 +2218,9 @@ Slave_worker *Log_event::get_slave_worke // the last occupied GAQ's array index rli->gaq->assigned_group_index= rli->gaq->en_queue((void *) &g); + DBUG_ASSERT(((Slave_job_group *) + dynamic_array_ptr(&rli->gaq->Q, rli->gaq->assigned_group_index))-> + group_relay_log_name == NULL); DBUG_ASSERT(rli->gaq->assigned_group_index != (ulong) -1); // gaq must have room DBUG_ASSERT(rli->last_assigned_worker == NULL); if (is_b_event) @@ -2251,6 +2254,9 @@ Slave_worker *Log_event::get_slave_worke { g.worker_id= worker->id; // todo/fixme: think of Slave_worker* here set_dynamic(&rli->gaq->Q, (uchar*) &g, rli->gaq->assigned_group_index); + + DBUG_ASSERT(g.group_relay_log_name == NULL); + } } else // r @@ -2296,6 +2302,9 @@ Slave_worker *Log_event::get_slave_worke ptr_g->group_relay_log_name= (char *) my_malloc(strlen(const_cast(rli)->get_group_relay_log_name()) + 1, MYF(MY_WME)); strcpy(ptr_g->group_relay_log_name, const_cast(rli)->get_group_relay_log_name()); + + DBUG_ASSERT(ptr_g->group_relay_log_name != NULL); + worker->relay_log_change_notified= TRUE; } @@ -2326,6 +2335,7 @@ Slave_worker *Log_event::get_slave_worke return worker; } +// returns the next available! (TODO: incompatible to circurla_buff method!!!) static int en_queue(Slave_jobs_queue *jobs, Slave_job_item *item) { if (jobs->a == jobs->s) @@ -2436,9 +2446,9 @@ void append_item_to_jobs(slave_job_item new_pend_size= rli->mts_pending_jobs_size + ((Log_event*) (job_item->data))->data_written; } + rli->pending_jobs++; rli->mts_pending_jobs_size= new_pend_size; rli->stmt_jobs++; - rli->pending_jobs++; mysql_mutex_unlock(&rli->pending_jobs_lock); @@ -2486,7 +2496,8 @@ void append_item_to_jobs(slave_job_item { mysql_mutex_unlock(&w->jobs_lock); mysql_mutex_lock(&rli->pending_jobs_lock); - rli->pending_jobs--; // roll back of the prev incr + rli->pending_jobs--; // roll back of the prev incr + rli->mts_pending_jobs_size -= new_pend_size; mysql_mutex_unlock(&rli->pending_jobs_lock); } } @@ -2690,6 +2701,8 @@ int slave_worker_exec_job(Slave_worker * if (ev->ends_group() || !w->curr_group_seen_begin) { + DBUG_PRINT("slave_worker_exec_job:", (" commits GAQ index %lu, last committed %lu", ev->mts_group_cnt, w->last_group_done_index)); + w->slave_worker_ends_group(ev->mts_group_cnt, error); /* last done sets post exec */ w->checkpoint(w->w_rli); } === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-12-01 17:08:21 +0000 +++ b/sql/mysqld.cc 2010-12-02 17:46:46 +0000 @@ -460,7 +460,7 @@ ulong slave_trans_retries; uint slave_net_timeout; ulong slave_exec_mode_options; ulonglong slave_type_conversions_options; -ulong slave_parallel_workers; +ulong opt_slave_parallel_workers; ulong opt_mts_slave_worker_queue_len_max; my_bool slave_local_timestamp_opt; my_bool opt_slave_run_query_in_parallel; === modified file 'sql/mysqld.h' --- a/sql/mysqld.h 2010-12-01 17:08:21 +0000 +++ b/sql/mysqld.h 2010-12-02 17:46:46 +0000 @@ -172,7 +172,7 @@ extern my_bool allow_slave_start; extern LEX_CSTRING reason_slave_blocked; extern ulong slave_trans_retries; extern uint slave_net_timeout; -extern ulong slave_parallel_workers; +extern ulong opt_slave_parallel_workers; extern ulong opt_mts_slave_worker_queue_len_max; extern my_bool slave_local_timestamp_opt; extern my_bool opt_slave_run_query_in_parallel; === modified file 'sql/rpl_rli.cc' --- a/sql/rpl_rli.cc 2010-12-01 17:08:21 +0000 +++ b/sql/rpl_rli.cc 2010-12-02 17:46:46 +0000 @@ -68,7 +68,7 @@ Relay_log_info::Relay_log_info(bool is_s until_log_pos(0), retried_trans(0), tables_to_lock(0), tables_to_lock_count(0), rows_query_ev(NULL), last_event_start_time(0), - this_worker(NULL), slave_worker_is_error(NULL), + this_worker(NULL), slave_parallel_workers(0), sql_delay(0), sql_delay_end(0), m_flags(0) { @@ -83,6 +83,9 @@ Relay_log_info::Relay_log_info(bool is_s &log_space_lock, MY_MUTEX_INIT_FAST); mysql_cond_init(key_relay_log_info_log_space_cond, &log_space_cond, NULL); relay_log.init_pthread_objects(); + +#if 0 + /* Parallel slave parameters initialization is done regardless whether the feature is or going to be active or not. @@ -124,9 +127,65 @@ Relay_log_info::Relay_log_info(bool is_s MY_MUTEX_INIT_FAST); mysql_cond_init(key_cond_slave_parallel_pend_jobs, &pending_jobs_cond, NULL); my_init_dynamic_array(&workers, sizeof(Slave_worker *), slave_parallel_workers, 4); + +#endif + DBUG_VOID_RETURN; } +/** + The method to invoke at slave threads start +*/ +void Relay_log_info::init_workers(ulong n) +{ + uint wi= 0; + + slave_parallel_workers= n; + /* + Parallel slave parameters initialization is done regardless + whether the feature is or going to be active or not. + */ + trans_jobs= stmt_jobs= pending_jobs= wait_jobs= 0; + + key_mutex_slave_parallel_worker= new PSI_mutex_key[slave_parallel_workers]; + key_cond_slave_parallel_worker= new PSI_cond_key[slave_parallel_workers]; + worker_mutexes= new PSI_mutex_info[slave_parallel_workers]; + worker_conds= new PSI_cond_info[slave_parallel_workers]; + for (wi= 0; wi < slave_parallel_workers; wi++) + { + worker_mutexes[wi].m_key= (PSI_mutex_key *) &(key_mutex_slave_parallel_worker[wi]); + worker_mutexes[wi].m_name= "Slave_worker::jobs_lock"; + worker_mutexes[wi].m_flags= 0; + worker_conds[wi].m_key= (PSI_cond_key *) &(key_cond_slave_parallel_worker[wi]); + worker_conds[wi].m_name= "Slave_worker::jobs_cond"; + worker_conds[wi].m_flags= 0; + } + if (PSI_server) + { + PSI_server->register_mutex("worker", worker_mutexes, + slave_parallel_workers); + PSI_server->register_cond("worker", worker_conds, + slave_parallel_workers); + } + mysql_mutex_init(key_mutex_slave_parallel_pend_jobs, &pending_jobs_lock, + MY_MUTEX_INIT_FAST); + mysql_cond_init(key_cond_slave_parallel_pend_jobs, &pending_jobs_cond, NULL); + my_init_dynamic_array(&workers, sizeof(Slave_worker *), slave_parallel_workers, 4); +} + +/** + The method to invoke at slave threads stop +*/ +void Relay_log_info::deinit_workers() +{ + mysql_mutex_destroy(&pending_jobs_lock); + mysql_cond_destroy(&pending_jobs_cond); + + if (!this_worker) + delete_dynamic(&workers); + slave_parallel_workers= 0; +} + Relay_log_info::~Relay_log_info() { DBUG_ENTER("Relay_log_info::~Relay_log_info"); @@ -135,16 +194,40 @@ Relay_log_info::~Relay_log_info() mysql_cond_destroy(&log_space_cond); relay_log.cleanup(); +#if 0 + mysql_mutex_destroy(&pending_jobs_lock); mysql_cond_destroy(&pending_jobs_cond); if (!this_worker) delete_dynamic(&workers); +#endif + DBUG_VOID_RETURN; } /** + Method is called when MTS coordinator senses the relay-log name + has been changed. + It marks each Worker member with this fact to make an action + at time it will distribute a terminal event of a group to the Worker. + + Worker receives the new name at the group commiting phase + @c Slave_worker::slave_worker_ends_group(). +*/ +void Relay_log_info::reset_notified_relay_log_change() +{ + if (!is_parallel_exec()) + return; + for (uint i= 0; i < workers.elements; i++) + { + Slave_worker *w= *(Slave_worker **) dynamic_array_ptr(&workers, i); + w->relay_log_change_notified= FALSE; + } +} + +/** The method can be run both by C having the Main (coord) rli context and by W having both the main and the Local (worker) rli context. Decision matrix: === modified file 'sql/rpl_rli.h' --- a/sql/rpl_rli.h 2010-12-01 17:08:21 +0000 +++ b/sql/rpl_rli.h 2010-12-02 17:46:46 +0000 @@ -442,8 +442,9 @@ public: Slave_worker* set_this_worker(Slave_worker *w) { return this_worker= w; } Slave_worker* this_worker; // used by w_rli. The cental rli has it as NULL. ulonglong mts_total_groups; // total event groups distributed in current session - volatile Slave_worker* slave_worker_is_error; + bool curr_group_is_parallel; // a mark for Coord to indicate on T-event of the curr group at delete + ulong slave_parallel_workers; // one slave session time number of workers /* A sorted array of Worker current assignements number to provide approximate view on Workers loading. @@ -452,6 +453,26 @@ public: */ DYNAMIC_ARRAY least_occupied_workers; + /* most of allocation in the coordinator rli is there */ + void init_workers(ulong); + + /* counterpart of the init */ + void deinit_workers(); + + /** + returns true if events are to be executed in parallel + */ + inline bool is_parallel_exec() const + { + bool ret= slave_parallel_workers > 0; + + DBUG_ASSERT(!ret || workers.elements > 0); + + return ret; + } + + void reset_notified_relay_log_change(); + /** Helper function to do after statement completion. @@ -612,21 +633,6 @@ public: int32 get_sql_delay() { return sql_delay; } void set_sql_delay(time_t _sql_delay) { sql_delay= _sql_delay; } time_t get_sql_delay_end() { return sql_delay_end; } - /** - mts-II: - returns true if events are to be executed in parallel - todo: - Consider a def SEQUENTIAL := sizeof(worker-pool) == 0 - PARALLEL := sizeof(worker-pool) > 0 - */ - inline bool is_parallel_exec() const - { - return workers.elements > 0 && - // TODO: bug to report!!! - // Sys_vqar_!enum! Slave_exec_mode -> Sys_var_*set* Slave_exec_mode - // bit_is_set(slave_exec_mode, SLAVE_EXEC_MODE_PARALLEL) == 1; - slave_exec_mode == SLAVE_EXEC_MODE_PARALLEL; - } private: === modified file 'sql/rpl_rli_pdb.cc' --- a/sql/rpl_rli_pdb.cc 2010-12-01 17:08:21 +0000 +++ b/sql/rpl_rli_pdb.cc 2010-12-02 17:46:46 +0000 @@ -485,8 +485,12 @@ void Slave_worker::slave_worker_ends_gro if (!error) { Slave_job_group *ptr_g= - (Slave_job_group *) - dynamic_array_ptr(&c_rli->gaq->Q, c_rli->gaq->assigned_group_index); + (Slave_job_group *) dynamic_array_ptr(&c_rli->gaq->Q, gaq_idx); + + // first ever group must have relay log name + DBUG_ASSERT(last_group_done_index != c_rli->gaq->s || + ptr_g->group_relay_log_name != NULL); + if (ptr_g->group_relay_log_name != NULL) { // memorizing a new relay-log file name @@ -580,6 +584,9 @@ ulong circular_buffer_queue::de_queue(uc return ret; } +/** + @return the used index at success or -1 when queue is full +*/ ulong circular_buffer_queue::en_queue(void *item) { ulong ret; === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2010-12-01 17:08:21 +0000 +++ b/sql/rpl_slave.cc 2010-12-02 17:46:46 +0000 @@ -1041,7 +1041,7 @@ static bool sql_slave_killed(THD* thd, R DBUG_ASSERT(rli->info_thd == thd || thd->slave_thread); DBUG_ASSERT(rli->slave_running == 1 || thd->slave_thread);// tracking buffer overrun - if (abort_loop || thd->killed || rli->abort_slave || rli->slave_worker_is_error) + if (abort_loop || thd->killed || rli->abort_slave) { if (thd->transaction.all.modified_non_trans_table && rli->is_in_group()) { @@ -2684,6 +2684,7 @@ int apply_event_and_update_pos(Log_event // experimental checkpoint per each scheduling attempt // logics of next_event() + if (rli->is_parallel_exec()) { uint i; rli->gaq->move_queue_head(&rli->workers); @@ -3578,7 +3579,6 @@ pthread_handler_t handle_slave_worker(vo if (error) { - rli->slave_worker_is_error= w; mysql_mutex_lock(&rli->info_thd->LOCK_thd_data); rli->info_thd->awake(THD::KILL_QUERY); // notify Crdn mysql_mutex_unlock(&rli->info_thd->LOCK_thd_data); @@ -3709,13 +3709,19 @@ int slave_start_workers(Relay_log_info * uint i; int error= 0; + if (n == 0) + return error; + + // RLI constructor time alloc/init + + rli->init_workers(n); + // CGAP dynarray holds id:s of partitions of the Current being executed Group my_init_dynamic_array(&rli->curr_group_assigned_parts, 1 + NAME_LEN + 1, SLAVE_INIT_DBS_IN_GROUP, 1); rli->last_assigned_worker= NULL; /* associated with curr_group_assigned */ my_init_dynamic_array(&rli->curr_group_da, sizeof(Log_event*), 8, 2); - // Least_occupied_workers array - my_init_dynamic_array(&rli->least_occupied_workers, - sizeof(Slave_jobs_queue::len), n, 0); + // Least_occupied_workers array to hold items size of Slave_jobs_queue::len + my_init_dynamic_array(&rli->least_occupied_workers, sizeof(ulong), n, 0); // GAQ queue holds seqno:s of scheduled groups. C polls workers in // @c lwm_checkpoint_period to update GAQ (see @c next_event()) @@ -3736,7 +3742,6 @@ int slave_start_workers(Relay_log_info * rli->mts_coordinator_basic_nap= ::opt_mts_coordinator_basic_nap; rli->mts_worker_underrun_level= ::opt_mts_worker_underrun_level; rli->mts_total_groups= 0; - rli->slave_worker_is_error= NULL; rli->curr_group_seen_begin= NULL; rli->run_query_in_parallel= opt_slave_run_query_in_parallel; for (i= 0; i < n; i++) @@ -3763,6 +3768,9 @@ void slave_stop_workers(Relay_log_info * { int i; THD *thd= rli->info_thd; + + if (rli->workers.elements == 0) + return; for (i= rli->workers.elements - 1; i >= 0; i--) { @@ -3823,6 +3831,8 @@ void slave_stop_workers(Relay_log_info * delete_dynamic(&rli->least_occupied_workers); // least occupied delete_dynamic(&rli->curr_group_da); // GCDA delete_dynamic(&rli->curr_group_assigned_parts); // GCAP + + rli->deinit_workers(); } /** @@ -3869,7 +3879,7 @@ pthread_handler_t handle_slave_sql(void pthread_detach_this_thread(); /* mts-II: starting the worker pool */ - if (slave_start_workers(rli, slave_parallel_workers) != 0) + if (slave_start_workers(rli, opt_slave_parallel_workers) != 0) goto err; if (init_slave_thread(thd, SLAVE_THD_SQL)) @@ -5149,9 +5159,7 @@ static Log_event* next_event(Relay_log_i llstr(my_b_tell(cur_log),llbuf1), llstr(rli->get_event_relay_log_pos(),llbuf2))); DBUG_ASSERT(my_b_tell(cur_log) >= BIN_LOG_HEADER_SIZE); - DBUG_ASSERT(my_b_tell(cur_log) == rli->get_event_relay_log_pos() || - //bit_is_set(slave_exec_mode_options, SLAVE_EXEC_MODE_PARALLEL) == 1); - slave_exec_mode_options == SLAVE_EXEC_MODE_PARALLEL); // todo: fix slave_exec_mode enum->set + DBUG_ASSERT(my_b_tell(cur_log) == rli->get_event_relay_log_pos()); DBUG_PRINT("info", ("next_event group master %s %lu group relay %s %lu event %s %lu\n", rli->get_group_master_log_name(), @@ -5380,10 +5388,12 @@ static Log_event* next_event(Relay_log_i } /* Reset the relay-log-change-notified status of Slave Workers */ - for (uint i= 0; i < rli->workers.elements; i++) + if (rli->is_parallel_exec()) { - Slave_worker *w= *(Slave_worker **) dynamic_array_ptr(&rli->workers, i); - w->relay_log_change_notified= FALSE; + DBUG_PRINT("info", ("next_event: MTS group relay log changes to %s %lu\n", + rli->get_group_relay_log_name(), + (ulong) rli->get_group_relay_log_pos())); + rli->reset_notified_relay_log_change(); } /* === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2010-11-20 17:23:42 +0000 +++ b/sql/sql_class.h 2010-12-02 17:46:46 +0000 @@ -62,7 +62,6 @@ enum enum_delay_key_write { DELAY_KEY_WR DELAY_KEY_WRITE_ALL }; enum enum_slave_exec_mode { SLAVE_EXEC_MODE_STRICT, SLAVE_EXEC_MODE_IDEMPOTENT, - SLAVE_EXEC_MODE_PARALLEL, SLAVE_EXEC_MODE_LOCAL_TIMESTAMP, SLAVE_EXEC_MODE_LAST_BIT }; enum enum_slave_type_conversions { SLAVE_TYPE_CONVERSIONS_ALL_LOSSY, === modified file 'sql/sys_vars.cc' --- a/sql/sys_vars.cc 2010-12-01 17:08:21 +0000 +++ b/sql/sys_vars.cc 2010-12-02 17:46:46 +0000 @@ -3107,8 +3107,8 @@ static Sys_var_ulong Sys_slave_trans_ret static Sys_var_ulong Sys_slave_parallel_workers( "slave_parallel_workers", "Number of worker threads for executing events in parallel ", - GLOBAL_VAR(slave_parallel_workers), CMD_LINE(REQUIRED_ARG), - VALID_RANGE(0, ULONG_MAX), DEFAULT(4), BLOCK_SIZE(1)); + GLOBAL_VAR(opt_slave_parallel_workers), CMD_LINE(REQUIRED_ARG), + VALID_RANGE(0, ULONG_MAX), DEFAULT(0), BLOCK_SIZE(1)); static Sys_var_ulong Sys_mts_slave_worker_queue_len_max( "mts_slave_worker_queue_len_max", "Max length of one MTS Worker queue. Presence in the queue indicates " @@ -3130,7 +3130,7 @@ static Sys_var_mybool Sys_slave_run_quer GLOBAL_VAR(opt_slave_run_query_in_parallel), CMD_LINE(OPT_ARG), DEFAULT(FALSE)); static Sys_var_ulong Sys_mts_partition_hash_soft_max( - "opt_mts_partition_hash_soft_max", + "mts_partition_hash_soft_max", "Number of records in the mts partition hash below which " "entries with zero usage are tolerated", GLOBAL_VAR(opt_mts_partition_hash_soft_max), CMD_LINE(REQUIRED_ARG), --===============0699111287== 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: 3f12271c69887860ea0f89385b1954a8fece3fee # timestamp: 2010-12-02 19:47:01 +0200 # base_revision_id: andrei.elkin@stripped\ # 7iwx57b885qn2ij3 # # Begin bundle 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 A7CtgA== --===============0699111287==--