From: Andrei Elkin Date: June 20 2011 1:33pm Subject: bzr push into mysql-next-mr-wl5569 branch (andrei.elkin:3310 to 3312) WL#5569 WL#5599 List-Archive: http://lists.mysql.com/commits/139525 Message-Id: <201106201333.p5KDXBD3015879@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1815879977==" --===============1815879977== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3312 Andrei Elkin 2011-06-20 [merge] wl#5569 MTS wl#5599 MTS recovery fixing valgrind warnings. modified: sql/rpl_rli_pdb.h sql/rpl_slave.cc 3311 Andrei Elkin 2011-06-20 wl#5569 MTS 1. mtr.add_suppression for all remained unattended tests that generate any error at applying by SQL thread or MTS' worker. An error by worker follows by a warning by coordinator. So it's suppressed. 2. kill of Coordinator is handled immediately without waiting for any ongoing group scheduling completion. So it can possibly create consistency issue. That is reported with an error. 3. Two tests are made to expect one of two errors depending on Single- or Multi-Threaded mode. @ mysql-test/extra/rpl_tests/rpl_conflicts.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/extra/rpl_tests/rpl_loaddata.test MTS reports an error that STS does not expect as bug#56287 notes. @ mysql-test/extra/rpl_tests/rpl_parallel_load.test cleanup. @ mysql-test/extra/rpl_tests/rpl_row_empty_imgs.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test MTS reports an error that STS does not expect as bug#56287 notes. @ mysql-test/suite/rpl/r/rpl_circular_for_4_hosts.result An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/r/rpl_heartbeat_basic.result An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/r/rpl_loaddata.result results updated. @ mysql-test/suite/rpl/t/rpl_circular_for_4_hosts.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/t/rpl_heartbeat_basic.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/t/rpl_loaddata_fatal.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/t/rpl_parallel.test cleanup. @ mysql-test/suite/rpl/t/rpl_parallel_multi_db-master.opt making post-execution check for warning not to fail. @ mysql-test/suite/rpl/t/rpl_parallel_start_stop.test kill of Coordinator is handled immediately to possibly create consistency issue. That is reported with an error. @ mysql-test/suite/rpl/t/rpl_row_img_sanity.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/t/rpl_row_inexist_tbl.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/t/rpl_show_errors.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/t/rpl_slave_start.test An error by worker follows by a warning by coordinator. So it's suppressed. @ mysql-test/suite/rpl/t/rpl_stm_000001.test An error by worker follows by a warning by coordinator. So it's suppressed. @ sql/rpl_reporting.h a new method to help in finding out whether an error has been already reported. @ sql/rpl_slave.cc Refining conditions for Coordinator to report a warning or an error in cases a. it's killed b. worker errored out and reported it. In the case a. the error level message is issue and in the case b. the warning level one. modified: mysql-test/extra/rpl_tests/rpl_conflicts.test mysql-test/extra/rpl_tests/rpl_loaddata.test mysql-test/extra/rpl_tests/rpl_parallel_load.test mysql-test/extra/rpl_tests/rpl_row_empty_imgs.test mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test mysql-test/suite/rpl/r/rpl_circular_for_4_hosts.result mysql-test/suite/rpl/r/rpl_heartbeat_basic.result mysql-test/suite/rpl/r/rpl_loaddata.result mysql-test/suite/rpl/r/rpl_loaddata_fatal.result mysql-test/suite/rpl/r/rpl_parallel.result mysql-test/suite/rpl/r/rpl_parallel_start_stop.result mysql-test/suite/rpl/r/rpl_row_conflicts.result mysql-test/suite/rpl/r/rpl_row_img_eng_full.result mysql-test/suite/rpl/r/rpl_row_img_sanity.result mysql-test/suite/rpl/r/rpl_row_inexist_tbl.result mysql-test/suite/rpl/r/rpl_sequential.result mysql-test/suite/rpl/r/rpl_show_errors.result mysql-test/suite/rpl/r/rpl_slave_load_remove_tmpfile.result mysql-test/suite/rpl/r/rpl_slave_start.result mysql-test/suite/rpl/r/rpl_stm_000001.result mysql-test/suite/rpl/r/rpl_stm_EE_err2.result mysql-test/suite/rpl/r/rpl_stm_conflicts.result mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result mysql-test/suite/rpl/t/rpl_circular_for_4_hosts.test mysql-test/suite/rpl/t/rpl_heartbeat_basic.test mysql-test/suite/rpl/t/rpl_loaddata_fatal.test mysql-test/suite/rpl/t/rpl_parallel.test mysql-test/suite/rpl/t/rpl_parallel_multi_db-master.opt mysql-test/suite/rpl/t/rpl_parallel_multi_db-slave.opt mysql-test/suite/rpl/t/rpl_parallel_start_stop.test mysql-test/suite/rpl/t/rpl_row_img_sanity.test mysql-test/suite/rpl/t/rpl_row_inexist_tbl.test mysql-test/suite/rpl/t/rpl_show_errors.test mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test mysql-test/suite/rpl/t/rpl_slave_start.test mysql-test/suite/rpl/t/rpl_stm_000001.test sql/rpl_reporting.h sql/rpl_slave.cc 3310 Andrei Elkin 2011-06-20 wl#5569 MTS fixing tests. Adding suppressions to few tests that produce sql thread error. Experimenting with rpl_relayrotate to descrease number of rotations and thus to make it clear if timeout is not due to computational load. modified: mysql-test/extra/rpl_tests/rpl_extra_col_slave.test mysql-test/extra/rpl_tests/rpl_relayrotate.test mysql-test/extra/rpl_tests/rpl_row_tabledefs.test mysql-test/suite/rpl/r/rpl_extra_col_slave_innodb.result mysql-test/suite/rpl/r/rpl_extra_col_slave_myisam.result mysql-test/suite/rpl/r/rpl_row_colSize.result mysql-test/suite/rpl/r/rpl_row_tabledefs_2myisam.result mysql-test/suite/rpl/r/rpl_row_tabledefs_3innodb.result mysql-test/suite/rpl/t/rpl_row_colSize.test === modified file 'mysql-test/extra/rpl_tests/rpl_conflicts.test' --- a/mysql-test/extra/rpl_tests/rpl_conflicts.test 2011-02-23 20:01:27 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_conflicts.test 2011-06-20 13:26:35 +0000 @@ -98,6 +98,7 @@ if (`SELECT @@global.binlog_format != 'R --eval SELECT "$err" as 'Last_SQL_Error (expected "duplicate key" error)' --enable_query_log call mtr.add_suppression("Slave SQL.*Duplicate entry .1. for key .PRIMARY.* Error_code: 1062"); + call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); SELECT * FROM t1; === modified file 'mysql-test/extra/rpl_tests/rpl_loaddata.test' --- a/mysql-test/extra/rpl_tests/rpl_loaddata.test 2011-06-17 18:01:58 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_loaddata.test 2011-06-20 13:26:35 +0000 @@ -158,10 +158,11 @@ if (`SELECT @@global.binlog_format != 'R { # Query causes error on master but not on slave. This causes the slave to # stop with error code 0 (which is wrong: see BUG#57287) - --let $slave_sql_errno= 0 + --let $slave_sql_errno= 0,1740 --source include/wait_for_slave_sql_error.inc drop table t1, t2; } + connection master; drop table t1, t2; === modified file 'mysql-test/extra/rpl_tests/rpl_parallel_load.test' --- a/mysql-test/extra/rpl_tests/rpl_parallel_load.test 2011-06-15 17:12:11 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_parallel_load.test 2011-06-20 13:26:35 +0000 @@ -252,15 +252,24 @@ let $wait_timeout= 600; let $wait_condition= SELECT count(*)+sleep(1) = 5 FROM test0.benchmark; source include/wait_condition.inc; +# cleanup for files that could not be removed in the end of previous invocation. +let $MYSQLD_DATADIR= `select @@datadir`; +--remove_files_wildcard $MYSQLD_DATADIR *.out + use test; -select * from test0.benchmark into outfile 'benchmark.out'; +let $benchmark_file= `select replace(concat("benchmark_",uuid(),".out"),"-","_")`; +--replace_regex /benchmark_.*.out/benchmark.out/ +eval select * from test0.benchmark into outfile '$benchmark_file'; select ts from test0.benchmark where state like 'master started load' into @m_0; select ts from test0.benchmark where state like 'master ends load' into @m_1; select ts from test0.benchmark where state like 'slave takes on load' into @s_0; select ts from test0.benchmark where state like 'slave ends load' into @s_1; -select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta_m', - time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s' into outfile 'delta.out'; +let $delta_file= `select replace(concat("delta_",uuid(),".out"),"-","_")`; +--replace_regex /delta_.*.out/delta.out/ +eval select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta_m', + time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s', + time_to_sec(@s_m1) - time_to_sec(@s_m0) as 'delta_sm' into outfile '$delta_file'; let $i = $databases + 1; while($i) === modified file 'mysql-test/extra/rpl_tests/rpl_row_empty_imgs.test' --- a/mysql-test/extra/rpl_tests/rpl_row_empty_imgs.test 2011-02-23 20:01:27 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_row_empty_imgs.test 2011-06-20 13:26:35 +0000 @@ -206,6 +206,8 @@ if ($lower_engine == ndb) SET SQL_LOG_BIN=0; call mtr.add_suppression("Slave: Can\'t find record in \'t1\' Error_code: 1032"); call mtr.add_suppression("Slave SQL: Could not execute Update_rows event on table test.t1; Can.t find record in .t1.* Error_code: 1032"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + SET SQL_LOG_BIN=1; # NOTE: Because of BUG#52473, when using NDB this will make the test === modified file 'mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test' --- a/mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test 2011-02-23 20:01:27 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_stm_EE_err2.test 2011-06-20 13:26:35 +0000 @@ -25,9 +25,13 @@ drop table t1; connection slave; call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.* error code=1062.*Error on slave:.* Error_code: 0"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + --echo (expect different error codes on master and slave) ---let $slave_sql_errno= 0 ---let $show_slave_sql_error= 1 +--let $slave_sql_errno= 0,1740 +# can't print error text. MTS reports a separate error in this case. +# Todo: to fix single-threaded-slave BUG#57287. +--let $show_slave_sql_error= 0 --source include/wait_for_slave_sql_error.inc drop table t1; --source include/stop_slave.inc === modified file 'mysql-test/suite/rpl/r/rpl_circular_for_4_hosts.result' --- a/mysql-test/suite/rpl/r/rpl_circular_for_4_hosts.result 2011-03-16 16:38:30 +0000 +++ b/mysql-test/suite/rpl/r/rpl_circular_for_4_hosts.result 2011-06-20 13:26:35 +0000 @@ -6,6 +6,7 @@ CREATE TABLE t1 (a INT NOT NULL AUTO_INC CREATE TABLE t2 (a INT NOT NULL AUTO_INCREMENT, b VARCHAR(100), c INT NOT NULL, PRIMARY KEY(a)) ENGINE=InnoDB; include/rpl_sync.inc call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); *** Testing schema A->B->C->D->A *** === modified file 'mysql-test/suite/rpl/r/rpl_heartbeat_basic.result' --- a/mysql-test/suite/rpl/r/rpl_heartbeat_basic.result 2011-03-17 13:20:36 +0000 +++ b/mysql-test/suite/rpl/r/rpl_heartbeat_basic.result 2011-06-20 13:26:35 +0000 @@ -1,6 +1,7 @@ include/master-slave.inc [connection master] call mtr.add_suppression("Slave I/O: The slave I/O thread stops because a fatal error is encountered when it tried to SET @master_binlog_checksum"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); *** Preparing *** include/stop_slave.inc === modified file 'mysql-test/suite/rpl/r/rpl_loaddata.result' --- a/mysql-test/suite/rpl/r/rpl_loaddata.result 2011-06-17 18:01:58 +0000 +++ b/mysql-test/suite/rpl/r/rpl_loaddata.result 2011-06-20 13:26:35 +0000 @@ -73,7 +73,7 @@ load data infile '../../std_data/rpl_loa terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by '\n##\n' starting by '>' ignore 1 lines; ERROR 23000: Duplicate entry '2003-03-22' for key 'day' -include/wait_for_slave_sql_error.inc [errno=0] +include/wait_for_slave_sql_error.inc [errno=0,1740 ] drop table t1, t2; drop table t1, t2; CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB; === modified file 'mysql-test/suite/rpl/r/rpl_loaddata_fatal.result' --- a/mysql-test/suite/rpl/r/rpl_loaddata_fatal.result 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/r/rpl_loaddata_fatal.result 2011-06-20 13:26:35 +0000 @@ -4,6 +4,7 @@ CREATE TABLE t1 (a INT, b INT); INSERT INTO t1 VALUES (1,10); LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE t1; call mtr.add_suppression("Slave SQL.*Fatal error: Not enough memory, Error_code: 1593"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); include/wait_for_slave_sql_error_and_skip.inc [errno=1593] Last_SQL_Error = 'Fatal error: Not enough memory' DROP TABLE t1; === modified file 'mysql-test/suite/rpl/r/rpl_parallel.result' --- a/mysql-test/suite/rpl/r/rpl_parallel.result 2011-06-15 23:27:20 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel.result 2011-06-20 13:26:35 +0000 @@ -10,8 +10,7 @@ select ts from test0.benchmark where sta select ts from test0.benchmark where state like 'master ends load' into @m_1; select ts from test0.benchmark where state like 'slave takes on load' into @s_0; select ts from test0.benchmark where state like 'slave ends load' into @s_1; -select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta_m', -time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s' into outfile 'delta.out'; +select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta.out'; include/diff_tables.inc [master:test15.v_tm_nk, slave:test15.v_tm_nk] include/diff_tables.inc [master:test15.v_ti_nk, slave:test15.v_ti_nk] include/diff_tables.inc [master:test15.v_tm_wk, slave:test15.v_tm_wk] === modified file 'mysql-test/suite/rpl/r/rpl_parallel_start_stop.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_start_stop.result 2011-06-15 17:12:11 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_start_stop.result 2011-06-20 13:26:35 +0000 @@ -2,6 +2,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'); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); 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%'; @@ -15,7 +16,7 @@ include/wait_for_slave_sql_to_stop.inc include/start_slave.inc select id from coord_proc_list into @c_id; kill query @c_id; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1740] include/start_slave.inc CREATE TABLE t1 (a int primary key) engine=innodb; insert into t1 values (1),(2); === modified file 'mysql-test/suite/rpl/r/rpl_row_conflicts.result' --- a/mysql-test/suite/rpl/r/rpl_row_conflicts.result 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_conflicts.result 2011-06-20 13:26:35 +0000 @@ -24,6 +24,7 @@ include/wait_for_slave_sql_error.inc [er Last_SQL_Error (expected "duplicate key" error) Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log master-bin.000001, end_log_pos END_LOG_POS call mtr.add_suppression("Slave SQL.*Duplicate entry .1. for key .PRIMARY.* Error_code: 1062"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); SELECT * FROM t1; a 1 === modified file 'mysql-test/suite/rpl/r/rpl_row_img_eng_full.result' --- a/mysql-test/suite/rpl/r/rpl_row_img_eng_full.result 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_img_eng_full.result 2011-06-20 13:26:35 +0000 @@ -3642,6 +3642,7 @@ c1 c2 SET SQL_LOG_BIN=0; call mtr.add_suppression("Slave: Can\'t find record in \'t1\' Error_code: 1032"); call mtr.add_suppression("Slave SQL: Could not execute Update_rows event on table test.t1; Can.t find record in .t1.* Error_code: 1032"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); SET SQL_LOG_BIN=1; include/wait_for_slave_sql_error_and_skip.inc [errno=1032] DROP TABLE t1; @@ -3825,6 +3826,7 @@ c1 c2 SET SQL_LOG_BIN=0; call mtr.add_suppression("Slave: Can\'t find record in \'t1\' Error_code: 1032"); call mtr.add_suppression("Slave SQL: Could not execute Update_rows event on table test.t1; Can.t find record in .t1.* Error_code: 1032"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); SET SQL_LOG_BIN=1; include/wait_for_slave_sql_error_and_skip.inc [errno=1032] DROP TABLE t1; === modified file 'mysql-test/suite/rpl/r/rpl_row_img_sanity.result' --- a/mysql-test/suite/rpl/r/rpl_row_img_sanity.result 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_img_sanity.result 2011-06-20 13:26:35 +0000 @@ -2,6 +2,7 @@ include/master-slave.inc [connection master] call mtr.add_suppression("Slave: Can\'t find record in \'t\' Error_code: 1032"); call mtr.add_suppression("Slave SQL: Could not execute Update_rows event on table test.t; Can.t find record in .t.* Error_code: 1032"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); SHOW VARIABLES LIKE 'binlog_row_image'; Variable_name Value binlog_row_image FULL === modified file 'mysql-test/suite/rpl/r/rpl_row_inexist_tbl.result' --- a/mysql-test/suite/rpl/r/rpl_row_inexist_tbl.result 2011-02-23 11:54:58 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_inexist_tbl.result 2011-06-20 13:26:35 +0000 @@ -11,6 +11,7 @@ INSERT INTO t1 VALUES (1); ==== Verify error on slave ==== [on slave] call mtr.add_suppression("Slave SQL.*Error executing row event: .Table .test.t1. doesn.t exist., Error_code: 1146"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); include/wait_for_slave_sql_error.inc [errno=1146] ==== Clean up ==== include/stop_slave_io.inc === modified file 'mysql-test/suite/rpl/r/rpl_sequential.result' --- a/mysql-test/suite/rpl/r/rpl_sequential.result 2011-06-15 17:41:33 +0000 +++ b/mysql-test/suite/rpl/r/rpl_sequential.result 2011-06-20 13:26:35 +0000 @@ -14,8 +14,7 @@ select ts from test0.benchmark where sta select ts from test0.benchmark where state like 'master ends load' into @m_1; select ts from test0.benchmark where state like 'slave takes on load' into @s_0; select ts from test0.benchmark where state like 'slave ends load' into @s_1; -select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta_m', -time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s' into outfile 'delta.out'; +select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta.out'; include/diff_tables.inc [master:test15.v_tm_nk, slave:test15.v_tm_nk] include/diff_tables.inc [master:test15.v_ti_nk, slave:test15.v_ti_nk] include/diff_tables.inc [master:test15.v_tm_wk, slave:test15.v_tm_wk] === modified file 'mysql-test/suite/rpl/r/rpl_show_errors.result' --- a/mysql-test/suite/rpl/r/rpl_show_errors.result 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/r/rpl_show_errors.result 2011-06-20 13:26:35 +0000 @@ -4,6 +4,7 @@ CREATE TABLE t1 (a INT, b blob, PRIMARY DROP TABLE t1; DROP TABLE t1; call mtr.add_suppression("Slave SQL: Error .Unknown table .test.t1.. on query.* Error_code: 1051"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); include/wait_for_slave_sql_error.inc [errno=1051] include/assert.inc [Last_SQL_Error_Timestamp is not null and matches the expected format] include/stop_slave.inc === modified file 'mysql-test/suite/rpl/r/rpl_slave_load_remove_tmpfile.result' --- a/mysql-test/suite/rpl/r/rpl_slave_load_remove_tmpfile.result 2011-03-15 15:16:34 +0000 +++ b/mysql-test/suite/rpl/r/rpl_slave_load_remove_tmpfile.result 2011-06-20 13:26:35 +0000 @@ -17,5 +17,6 @@ call mtr.add_suppression("Slave: Can't g call mtr.add_suppression("Slave SQL: Error .Can.t get stat of.* Error_code: 13"); call mtr.add_suppression("Slave: File.* not found.*"); call mtr.add_suppression("Slave SQL: Error .File.* not found.* Error_code: 29"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); SET @@GLOBAL.DEBUG = ''; include/rpl_end.inc === modified file 'mysql-test/suite/rpl/r/rpl_slave_start.result' --- a/mysql-test/suite/rpl/r/rpl_slave_start.result 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/r/rpl_slave_start.result 2011-06-20 13:26:35 +0000 @@ -7,6 +7,7 @@ include/master-slave.inc [on slave] CALL mtr.add_suppression("Slave: Table 't1' already exists Error_code: 1050"); CALL mtr.add_suppression("Slave SQL: Error .Table .t1. already exists. on query.* Error_code: 1050"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); # The statement makes SQL thread to fail. CREATE TABLE t1(c1 INT); [on master] === modified file 'mysql-test/suite/rpl/r/rpl_stm_000001.result' --- a/mysql-test/suite/rpl/r/rpl_stm_000001.result 2011-06-19 13:11:25 +0000 +++ b/mysql-test/suite/rpl/r/rpl_stm_000001.result 2011-06-20 13:26:35 +0000 @@ -1,6 +1,7 @@ include/master-slave.inc [connection master] CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); create table t1 (word char(20) not null); load data infile '../../std_data/words.dat' into table t1; load data local infile 'MYSQL_TEST_DIR/std_data/words.dat' into table t1; === modified file 'mysql-test/suite/rpl/r/rpl_stm_EE_err2.result' --- a/mysql-test/suite/rpl/r/rpl_stm_EE_err2.result 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/r/rpl_stm_EE_err2.result 2011-06-20 13:26:35 +0000 @@ -8,9 +8,9 @@ insert into t1 values(1),(2); ERROR 23000: Duplicate entry '2' for key 'a' drop table t1; call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.* error code=1062.*Error on slave:.* Error_code: 0"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); (expect different error codes on master and slave) -include/wait_for_slave_sql_error.inc [errno=0] -Last_SQL_Error = 'Query caused different errors on master and slave. Error on master: message (format)='Duplicate entry '%-.192s' for key %d' error code=1062 ; Error on slave: actual message='no error', error code=0. Default database: 'test'. Query: 'insert into t1 values(1),(2)'' +include/wait_for_slave_sql_error.inc [errno=0,1740] drop table t1; include/stop_slave.inc RESET SLAVE; === modified file 'mysql-test/suite/rpl/r/rpl_stm_conflicts.result' --- a/mysql-test/suite/rpl/r/rpl_stm_conflicts.result 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/r/rpl_stm_conflicts.result 2011-06-20 13:26:35 +0000 @@ -19,6 +19,7 @@ include/wait_for_slave_sql_error.inc [er Last_SQL_Error (expected "duplicate key" error) Error 'Duplicate entry '1' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'INSERT INTO t1 VALUES (1)' call mtr.add_suppression("Slave SQL.*Duplicate entry .1. for key .PRIMARY.* Error_code: 1062"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); SELECT * FROM t1; a 1 === modified file 'mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result' --- a/mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result 2011-06-17 18:01:58 +0000 +++ b/mysql-test/suite/rpl/r/rpl_stm_loaddata_concurrent.result 2011-06-20 13:26:35 +0000 @@ -89,7 +89,7 @@ load data CONCURRENT infile '../../std_d terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by '\n##\n' starting by '>' ignore 1 lines; ERROR 23000: Duplicate entry '2003-03-22' for key 'day' -include/wait_for_slave_sql_error.inc [errno=0] +include/wait_for_slave_sql_error.inc [errno=0,1740 ] drop table t1, t2; drop table t1, t2; CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB; === modified file 'mysql-test/suite/rpl/t/rpl_circular_for_4_hosts.test' --- a/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts.test 2011-03-17 13:20:36 +0000 +++ b/mysql-test/suite/rpl/t/rpl_circular_for_4_hosts.test 2011-06-20 13:26:35 +0000 @@ -31,6 +31,8 @@ CREATE TABLE t2 (a INT NOT NULL AUTO_INC --source include/rpl_sync.inc --connection server_4 call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + --echo # === modified file 'mysql-test/suite/rpl/t/rpl_heartbeat_basic.test' --- a/mysql-test/suite/rpl/t/rpl_heartbeat_basic.test 2011-03-17 13:20:36 +0000 +++ b/mysql-test/suite/rpl/t/rpl_heartbeat_basic.test 2011-06-20 13:26:35 +0000 @@ -18,6 +18,7 @@ --source include/have_binlog_format_mixed.inc call mtr.add_suppression("Slave I/O: The slave I/O thread stops because a fatal error is encountered when it tried to SET @master_binlog_checksum"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); --echo === modified file 'mysql-test/suite/rpl/t/rpl_loaddata_fatal.test' --- a/mysql-test/suite/rpl/t/rpl_loaddata_fatal.test 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/t/rpl_loaddata_fatal.test 2011-06-20 13:26:35 +0000 @@ -16,6 +16,8 @@ LOAD DATA INFILE '../../std_data/rpl_loa connection slave; call mtr.add_suppression("Slave SQL.*Fatal error: Not enough memory, Error_code: 1593"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + let $slave_sql_errno= 1593; let $show_slave_sql_error= 1; source include/wait_for_slave_sql_error_and_skip.inc; === modified file 'mysql-test/suite/rpl/t/rpl_parallel.test' --- a/mysql-test/suite/rpl/t/rpl_parallel.test 2011-06-15 17:12:11 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel.test 2011-06-20 13:26:35 +0000 @@ -27,7 +27,6 @@ # In the end there will be mysql-test/delta.{parallel,sequential}.log files. # -let $rpl_skip_reset_master_and_slave= 1; --source include/master-slave.inc connection master; === modified file 'mysql-test/suite/rpl/t/rpl_parallel_multi_db-master.opt' --- a/mysql-test/suite/rpl/t/rpl_parallel_multi_db-master.opt 2011-02-27 17:35:25 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_multi_db-master.opt 2011-06-20 13:26:35 +0000 @@ -1 +1 @@ ---thread_stack=512K +--thread_stack=512K --log-warnings=0 === modified file 'mysql-test/suite/rpl/t/rpl_parallel_multi_db-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_parallel_multi_db-slave.opt 2011-05-30 10:05:07 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_multi_db-slave.opt 2011-06-20 13:26:35 +0000 @@ -1,2 +1,2 @@ ---thread_stack=512K --slave-transaction-retries=0 +--thread_stack=512K --slave-transaction-retries=0 --log-warnings=0 === modified file 'mysql-test/suite/rpl/t/rpl_parallel_start_stop.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_start_stop.test 2011-06-15 17:12:11 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_start_stop.test 2011-06-20 13:26:35 +0000 @@ -15,6 +15,7 @@ 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'); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); create view worker_proc_list as SELECT id from Information_Schema.processlist where state like 'Waiting for an event from sql thread%'; @@ -66,7 +67,8 @@ let $count= 0; let $table= worker_proc_list; source include/wait_until_rows_count.inc; -source include/wait_for_slave_sql_to_stop.inc; +let $slave_sql_errno= 1740; # ER_MTS_PARALLEL_INCONSISTENT_DATA +source include/wait_for_slave_sql_error.inc; source include/start_slave.inc; === modified file 'mysql-test/suite/rpl/t/rpl_row_img_sanity.test' --- a/mysql-test/suite/rpl/t/rpl_row_img_sanity.test 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/t/rpl_row_img_sanity.test 2011-06-20 13:26:35 +0000 @@ -25,6 +25,8 @@ -- connection slave call mtr.add_suppression("Slave: Can\'t find record in \'t\' Error_code: 1032"); call mtr.add_suppression("Slave SQL: Could not execute Update_rows event on table test.t; Can.t find record in .t.* Error_code: 1032"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + -- connection master ## assertion: check that default value for binlog-row-image == 'FULL' === modified file 'mysql-test/suite/rpl/t/rpl_row_inexist_tbl.test' --- a/mysql-test/suite/rpl/t/rpl_row_inexist_tbl.test 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/t/rpl_row_inexist_tbl.test 2011-06-20 13:26:35 +0000 @@ -31,6 +31,8 @@ connection slave; # slave should have stopped because can't find table t1 # 1146 = ER_NO_SUCH_TABLE call mtr.add_suppression("Slave SQL.*Error executing row event: .Table .test.t1. doesn.t exist., Error_code: 1146"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + --let $slave_sql_errno= 1146 --source include/wait_for_slave_sql_error.inc === modified file 'mysql-test/suite/rpl/t/rpl_show_errors.test' --- a/mysql-test/suite/rpl/t/rpl_show_errors.test 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/t/rpl_show_errors.test 2011-06-20 13:26:35 +0000 @@ -29,6 +29,8 @@ DROP TABLE t1; # remove a table that does not exist let $slave_sql_errno=1051; # ER_BAD_TABLE_ERROR call mtr.add_suppression("Slave SQL: Error .Unknown table .test.t1.. on query.* Error_code: 1051"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + -- source include/wait_for_slave_sql_error.inc --let $errts0= query_get_value("SHOW SLAVE STATUS", $field, 1) === modified file 'mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test' --- a/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test 2011-03-15 15:16:34 +0000 +++ b/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test 2011-06-20 13:26:35 +0000 @@ -72,6 +72,8 @@ call mtr.add_suppression("Slave: Can't g call mtr.add_suppression("Slave SQL: Error .Can.t get stat of.* Error_code: 13"); call mtr.add_suppression("Slave: File.* not found.*"); call mtr.add_suppression("Slave SQL: Error .File.* not found.* Error_code: 29"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + --let $rpl_only_running_threads= 1 eval SET @@GLOBAL.DEBUG = '$old_debug'; === modified file 'mysql-test/suite/rpl/t/rpl_slave_start.test' --- a/mysql-test/suite/rpl/t/rpl_slave_start.test 2011-02-23 20:01:27 +0000 +++ b/mysql-test/suite/rpl/t/rpl_slave_start.test 2011-06-20 13:26:35 +0000 @@ -10,6 +10,8 @@ connection slave; CALL mtr.add_suppression("Slave: Table 't1' already exists Error_code: 1050"); CALL mtr.add_suppression("Slave SQL: Error .Table .t1. already exists. on query.* Error_code: 1050"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + --echo # The statement makes SQL thread to fail. CREATE TABLE t1(c1 INT); === modified file 'mysql-test/suite/rpl/t/rpl_stm_000001.test' --- a/mysql-test/suite/rpl/t/rpl_stm_000001.test 2011-06-19 13:11:25 +0000 +++ b/mysql-test/suite/rpl/t/rpl_stm_000001.test 2011-06-20 13:26:35 +0000 @@ -4,6 +4,8 @@ -- source include/master-slave.inc CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state"); + --let $engine_type= myisam # Load some data into t1 === modified file 'sql/rpl_reporting.h' --- a/sql/rpl_reporting.h 2011-06-09 15:27:47 +0000 +++ b/sql/rpl_reporting.h 2011-06-20 13:26:35 +0000 @@ -127,6 +127,7 @@ public: }; Error const& last_error() const { return m_last_error; } + bool is_error() const { return last_error().number != 0; } virtual ~Slave_reporting_capability()= 0; private: === modified file 'sql/rpl_rli_pdb.h' --- a/sql/rpl_rli_pdb.h 2011-06-18 18:58:21 +0000 +++ b/sql/rpl_rli_pdb.h 2011-06-20 10:52:44 +0000 @@ -119,9 +119,7 @@ public: typedef struct st_slave_job_group { char *group_master_log_name; // (actually redundant) - my_off_t master_log_pos; // B-event log_pos my_off_t group_master_log_pos; // T-event lop_pos filled by W for CheckPoint - my_off_t group_relay_log_pos; // filled by W /* When RL name changes C allocates and fill in a new name of RL, @@ -133,10 +131,13 @@ typedef struct st_slave_job_group Freeing unless NULL is left to C at CheckPoint. */ char *group_relay_log_name; // The value is last seen relay-log + my_off_t group_relay_log_pos; // filled by W + ulong worker_id; Slave_worker *worker; ulonglong total_seqno; + my_off_t master_log_pos; // B-event log_pos /* checkpoint coord are reset by CP and rotate:s */ uint checkpoint_seqno; my_off_t checkpoint_log_pos; // T-event lop_pos filled by W for CheckPoint === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2011-06-19 08:04:19 +0000 +++ b/sql/rpl_slave.cc 2011-06-20 13:32:33 +0000 @@ -192,6 +192,8 @@ static int terminate_slave_thread(THD *t bool skip_lock); static bool check_io_slave_killed(THD *thd, Master_info *mi, const char *info); int slave_worker_exec_job(Slave_worker * w, Relay_log_info *rli); +static int mts_event_coord_cmp(LOG_POS_COORD *id1, LOG_POS_COORD *id2); +static int mts_event_job_cmp(Slave_job_group *id1, Slave_job_group *id2); /* Find out which replications threads are running @@ -1073,7 +1075,7 @@ static bool io_slave_killed(THD* thd, Ma static bool sql_slave_killed(THD* thd, Relay_log_info* rli) { bool ret= FALSE; - bool is_parallel_group= FALSE; + bool is_parallel_warn= FALSE; DBUG_ENTER("sql_slave_killed"); @@ -1085,8 +1087,11 @@ static bool sql_slave_killed(THD* thd, R 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. + Killed Coordinator thread expects the worst so it warns on + possible consistency issue. */ - if ((is_parallel_group= rli->is_mts_in_group()) + if ((is_parallel_warn= (rli->is_parallel_exec() && + (rli->is_mts_in_group() || thd->killed))) || (!rli->is_parallel_exec() && thd->transaction.all.cannot_safely_rollback() && rli->is_in_group())) @@ -1136,7 +1141,7 @@ static bool sql_slave_killed(THD* thd, R if (!ret) { rli->report(WARNING_LEVEL, 0, - !is_parallel_group ? + !is_parallel_warn ? "Request to stop slave SQL Thread received while " "applying a group that has non-transactional " "changes; waiting for completion of the group ... " @@ -1148,8 +1153,9 @@ static bool sql_slave_killed(THD* thd, R } if (ret) { - if (is_parallel_group) - rli->report(WARNING_LEVEL, + if (is_parallel_warn) + rli->report(!rli->is_error() ? ERROR_LEVEL : + WARNING_LEVEL, // an error was reported by Worker ER_MTS_PARALLEL_INCONSISTENT_DATA, ER(ER_MTS_PARALLEL_INCONSISTENT_DATA), msg_stopped_mts); @@ -3837,16 +3843,23 @@ int mts_event_coord_cmp(LOG_POS_COORD *i (poscmp < 0 ? -1 : (poscmp > 0 ? 1 : 0)))); } +int mts_event_job_cmp(Slave_job_group *id1, Slave_job_group *id2) +{ + longlong filecmp= strcmp(id1->checkpoint_log_name, id2->checkpoint_log_name); + longlong poscmp= id1->checkpoint_log_pos - id2->checkpoint_log_pos; + return (filecmp < 0 ? -1 : (filecmp > 0 ? 1 : + (poscmp < 0 ? -1 : (poscmp > 0 ? 1 : 0)))); +} + bool mts_recovery_groups(Relay_log_info *rli, MY_BITMAP *groups) { - Log_event *ev= NULL; // , *desc= NULL; + Log_event *ev= NULL; const char *log_name= NULL; const char *errmsg= NULL; bool error= FALSE; - DYNAMIC_ARRAY above_lwm_jobs; bool curr_group_seen_begin= FALSE; + DYNAMIC_ARRAY above_lwm_jobs; Slave_job_group job_worker; - Slave_job_group job_file; IO_CACHE log; File file; @@ -3871,14 +3884,19 @@ bool mts_recovery_groups(Relay_log_info Slave_worker *worker= Rpl_info_factory::create_worker(opt_worker_repository_id, id, rli); worker->init_info(); - retrieve_job(worker, job_file); LOG_POS_COORD w_last= {worker->group_master_log_name, worker->group_master_log_pos}; if (mts_event_coord_cmp(&w_last, &cp) > 0) { /* Inserts information into a dynamic array for further processing. + The jobs/workers are ordered by the last checkpoint positions + workers have seen. */ - insert_dynamic(&above_lwm_jobs, (uchar*) &job_file); + job_worker.worker= worker; + job_worker.checkpoint_log_pos= worker->checkpoint_master_log_pos; + job_worker.checkpoint_log_name= worker->checkpoint_master_log_name; + + insert_dynamic(&above_lwm_jobs, (uchar*) &job_worker); } else { @@ -3889,9 +3907,13 @@ bool mts_recovery_groups(Relay_log_info worker->end_info(); delete worker; } - }; + } - sort_dynamic(&above_lwm_jobs, (qsort_cmp) mts_event_coord_cmp); + /* + This sorts the array by the last checkpoint positions workers have seen + and is required in the next recovery phase to compute shift bits. + */ + sort_dynamic(&above_lwm_jobs, (qsort_cmp) mts_event_job_cmp); /* In what follows, the group Recovery Bitmap is constructed. @@ -4393,7 +4415,7 @@ void slave_stop_workers(Relay_log_info * for (i= rli->workers.elements - 1; i >= 0; i--) { - Slave_worker *w; + Slave_worker *w= NULL; get_dynamic((DYNAMIC_ARRAY*)&rli->workers, (uchar*) &w, i); mysql_mutex_lock(&w->jobs_lock); --===============1815879977== 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: db3556485a626e6a2be867f80b12d0956a038954 # timestamp: 2011-06-20 16:33:11 +0300 # source_branch: file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk/ # base_revision_id: andrei.elkin@stripped\ # rn6x9fwsuuw0rxtw # # Begin bundle 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 BhVKipKw283+s7H/i7kinChIYjzro4A= --===============1815879977==--