From 83bcd5dfab83948353b2f30bfe497f0a92d31977 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 27 Feb 2008 21:46:06 +0400 Subject: [PATCH] BUG#13861 - START SLAVE UNTIL may stop 1 evnt too late if log-slave-updates and circul repl After merge fixes. mysql-test/suite/rpl/t/rpl_dual_pos_advance-slave.opt: Rename: mysql-test/t/rpl_dual_pos_advance-slave.opt -> mysql-test/suite/rpl/t/rpl_dual_pos_advance-slave.opt mysql-test/include/wait_for_slave_sql_to_stop.inc: Do not change connection if it was requested by caller (needed for circular replication tests). mysql-test/suite/rpl/t/rpl_dual_pos_advance.test: Let include/wait_for_slave_sql_to_stop.inc know that we do not want to change connection to slave. sql/rpl_rli.cc: After merge fix. sql/rpl_rli.h: After merge fix. sql/slave.cc: After merge fix. --- mysql-test/include/wait_for_slave_sql_to_stop.inc | 5 ++++- .../{ => suite/rpl}/t/rpl_dual_pos_advance-slave.opt | 0 mysql-test/suite/rpl/t/rpl_dual_pos_advance.test | 9 +++++---- sql/rpl_rli.cc | 9 +++++++-- sql/rpl_rli.h | 2 +- sql/slave.cc | 4 ++-- 6 files changed, 19 insertions(+), 10 deletions(-) rename mysql-test/{ => suite/rpl}/t/rpl_dual_pos_advance-slave.opt (100%) diff --git a/mysql-test/include/wait_for_slave_sql_to_stop.inc b/mysql-test/include/wait_for_slave_sql_to_stop.inc index 7f435142901..cb5c437a586 100644 --- a/mysql-test/include/wait_for_slave_sql_to_stop.inc +++ b/mysql-test/include/wait_for_slave_sql_to_stop.inc @@ -9,7 +9,10 @@ # sql threads to stop # 3) If loops too long die. #################################################### -connection slave; +if (!$keep_connection) +{ + connection slave; +} let $row_number= 1; let $run= 1; let $counter= 300; diff --git a/mysql-test/t/rpl_dual_pos_advance-slave.opt b/mysql-test/suite/rpl/t/rpl_dual_pos_advance-slave.opt similarity index 100% rename from mysql-test/t/rpl_dual_pos_advance-slave.opt rename to mysql-test/suite/rpl/t/rpl_dual_pos_advance-slave.opt diff --git a/mysql-test/suite/rpl/t/rpl_dual_pos_advance.test b/mysql-test/suite/rpl/t/rpl_dual_pos_advance.test index 26e477786e1..d51b175ca00 100644 --- a/mysql-test/suite/rpl/t/rpl_dual_pos_advance.test +++ b/mysql-test/suite/rpl/t/rpl_dual_pos_advance.test @@ -12,6 +12,7 @@ source include/have_innodb.inc; # set up "dual head" +let $keep_connection= 1; connection slave; reset master; @@ -67,11 +68,11 @@ connection master; start slave until master_log_file="slave-bin.000001",master_log_pos=195; # wait until it's started (the position below is the start of "CREATE -# TABLE t2") (otherwise wait_for_slave_to_stop may return at once) +# TABLE t2") (otherwise wait_for_slave_sql_to_stop may return at once) select master_pos_wait("slave-bin.000001",137); ---source include/wait_for_slave_to_stop.inc +--source include/wait_for_slave_sql_to_stop.inc # then BUG#13861 causes t3 to show up below (because stopped too # late). @@ -80,12 +81,12 @@ show tables; # ensure that we do not break set @a=1; insert into t3 values(@a); start slave until master_log_file="slave-bin.000001",master_log_pos=438; ---source include/wait_for_slave_to_stop.inc +--source include/wait_for_slave_sql_to_stop.inc select * from t3; # ensure that we do not break transaction start slave until master_log_file="slave-bin.000001",master_log_pos=663; ---source include/wait_for_slave_to_stop.inc +--source include/wait_for_slave_sql_to_stop.inc select * from t3; start slave; diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc index 03f790b934f..96e6b194916 100644 --- a/sql/rpl_rli.cc +++ b/sql/rpl_rli.cc @@ -955,6 +955,11 @@ err: Check if condition stated in UNTIL clause of START SLAVE is reached. SYNOPSYS Relay_log_info::is_until_satisfied() + master_beg_pos position of the beginning of to be executed event + (not log_pos member of the event that points to the + beginning of the following event) + + DESCRIPTION Checks if UNTIL condition is reached. Uses caching result of last comparison of current log file name and target log file name. So cached @@ -979,7 +984,7 @@ err: false - condition not met */ -bool Relay_log_info::is_until_satisfied() +bool Relay_log_info::is_until_satisfied(my_off_t master_beg_pos) { const char *log_name; ulonglong log_pos; @@ -990,7 +995,7 @@ bool Relay_log_info::is_until_satisfied() if (until_condition == UNTIL_MASTER_POS) { log_name= group_master_log_name; - log_pos= group_master_log_pos; + log_pos= master_beg_pos; } else { /* until_condition == UNTIL_RELAY_POS */ diff --git a/sql/rpl_rli.h b/sql/rpl_rli.h index 36daffae1af..e13ea93842c 100644 --- a/sql/rpl_rli.h +++ b/sql/rpl_rli.h @@ -296,7 +296,7 @@ public: void close_temporary_tables(); /* Check if UNTIL condition is satisfied. See slave.cc for more. */ - bool is_until_satisfied(); + bool is_until_satisfied(my_off_t master_beg_pos); inline ulonglong until_pos() { return ((until_condition == UNTIL_MASTER_POS) ? group_master_log_pos : diff --git a/sql/slave.cc b/sql/slave.cc index 8bd28c903ae..b8d1fdfbb6b 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1990,7 +1990,7 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli) This tests if the position of the beginning of the current event hits the UNTIL barrier. */ - if (rli->until_condition != RELAY_LOG_INFO::UNTIL_NONE && + if (rli->until_condition != Relay_log_info::UNTIL_NONE && rli->is_until_satisfied((rli->is_in_group() || !ev->log_pos) ? rli->group_master_log_pos : ev->log_pos - ev->data_written)) @@ -2648,7 +2648,7 @@ Slave SQL thread aborted. Can't execute init_slave query"); do not want to wait for next event in this case. */ pthread_mutex_lock(&rli->data_lock); - if (rli->until_condition != RELAY_LOG_INFO::UNTIL_NONE && + if (rli->until_condition != Relay_log_info::UNTIL_NONE && rli->is_until_satisfied(rli->group_master_log_pos)) { char buf[22];