Commit 83bcd5df authored by unknown's avatar unknown

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.
parent eec647ba
...@@ -9,7 +9,10 @@ ...@@ -9,7 +9,10 @@
# sql threads to stop # sql threads to stop
# 3) If loops too long die. # 3) If loops too long die.
#################################################### ####################################################
connection slave; if (!$keep_connection)
{
connection slave;
}
let $row_number= 1; let $row_number= 1;
let $run= 1; let $run= 1;
let $counter= 300; let $counter= 300;
......
...@@ -12,6 +12,7 @@ source include/have_innodb.inc; ...@@ -12,6 +12,7 @@ source include/have_innodb.inc;
# set up "dual head" # set up "dual head"
let $keep_connection= 1;
connection slave; connection slave;
reset master; reset master;
...@@ -67,11 +68,11 @@ connection master; ...@@ -67,11 +68,11 @@ connection master;
start slave until master_log_file="slave-bin.000001",master_log_pos=195; 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 # 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); 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 # then BUG#13861 causes t3 to show up below (because stopped too
# late). # late).
...@@ -80,12 +81,12 @@ show tables; ...@@ -80,12 +81,12 @@ show tables;
# ensure that we do not break set @a=1; insert into t3 values(@a); # 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; 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; select * from t3;
# ensure that we do not break transaction # ensure that we do not break transaction
start slave until master_log_file="slave-bin.000001",master_log_pos=663; 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; select * from t3;
start slave; start slave;
......
...@@ -955,6 +955,11 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset, ...@@ -955,6 +955,11 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset,
Check if condition stated in UNTIL clause of START SLAVE is reached. Check if condition stated in UNTIL clause of START SLAVE is reached.
SYNOPSYS SYNOPSYS
Relay_log_info::is_until_satisfied() 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 DESCRIPTION
Checks if UNTIL condition is reached. Uses caching result of last Checks if UNTIL condition is reached. Uses caching result of last
comparison of current log file name and target log file name. So cached comparison of current log file name and target log file name. So cached
...@@ -979,7 +984,7 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset, ...@@ -979,7 +984,7 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset,
false - condition not met 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; const char *log_name;
ulonglong log_pos; ulonglong log_pos;
...@@ -990,7 +995,7 @@ bool Relay_log_info::is_until_satisfied() ...@@ -990,7 +995,7 @@ bool Relay_log_info::is_until_satisfied()
if (until_condition == UNTIL_MASTER_POS) if (until_condition == UNTIL_MASTER_POS)
{ {
log_name= group_master_log_name; log_name= group_master_log_name;
log_pos= group_master_log_pos; log_pos= master_beg_pos;
} }
else else
{ /* until_condition == UNTIL_RELAY_POS */ { /* until_condition == UNTIL_RELAY_POS */
......
...@@ -296,7 +296,7 @@ class Relay_log_info : public Slave_reporting_capability ...@@ -296,7 +296,7 @@ class Relay_log_info : public Slave_reporting_capability
void close_temporary_tables(); void close_temporary_tables();
/* Check if UNTIL condition is satisfied. See slave.cc for more. */ /* 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() inline ulonglong until_pos()
{ {
return ((until_condition == UNTIL_MASTER_POS) ? group_master_log_pos : return ((until_condition == UNTIL_MASTER_POS) ? group_master_log_pos :
......
...@@ -1990,7 +1990,7 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli) ...@@ -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 This tests if the position of the beginning of the current event
hits the UNTIL barrier. 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->is_until_satisfied((rli->is_in_group() || !ev->log_pos) ?
rli->group_master_log_pos : rli->group_master_log_pos :
ev->log_pos - ev->data_written)) ev->log_pos - ev->data_written))
...@@ -2648,7 +2648,7 @@ Slave SQL thread aborted. Can't execute init_slave query"); ...@@ -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. do not want to wait for next event in this case.
*/ */
pthread_mutex_lock(&rli->data_lock); 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)) rli->is_until_satisfied(rli->group_master_log_pos))
{ {
char buf[22]; char buf[22];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment