mariadb/mysql-test/suite/rpl/r/rpl_dual_pos_advance.result

61 lines
1.6 KiB
Text
Raw Normal View History

Fix for BUG#13023: "SQL Thread is up but doesn't move forward". Details in slave.cc; in short we now record whenever the slave I/O thread ignores a master's event because of its server id, and use this info in the slave SQL thread to advance Exec_master_log_pos. Because if we do not, this variable stays at the position of the last executed event, i.e. the last *non-ignored* executed one, which may not be the last of the master's binlog (and so the slave *looks* behind the master though it's data-wise it's not). mysql-test/t/rpl_dual_pos_advance-master.opt: empty; its goal is just to trigger a server restart after running the test, so that the master forgets that it was a slave (otherwise it affects the following tests). sql/log.cc: No more default arguments for Rotate_log_event constructor. MYSQL_LOG::appendv() is now called without mutex. sql/log_event.cc: Moving one Rotate_log_event constructor from log_event.h. Support for on-demand choice of duplicating the string argument of the constructor or not (because there now are needs for both alternatives, see slave.cc). sql/log_event.h: We now have a case where a Rotate_log_event is executed by the slave SQL thread while not being in the relay log, so it needs to pretend its length is 0: a ZERO_LEN flag for that; a flag DUP_NAME (replaces "bool alloced") to be able to choose if we want the constructor to duplicate the string argument or not. sql/slave.cc: A comment for BUG#13861 (to be fixed). llstr() instead of %ld as the number is ulonglong. mi->rli becomes rli in some places. Fix for BUG#13023: - in the slave I/O thread, whenever we ignore an event because of its server id we update a couple of coordinates in memory - in the slave SQL thread, whenever we bump into the end of the latest relay log, we check this couple of coordinates to see if we should advance our Exec_master_log_pos. - when the slave I/O thread terminates it saves these in-memory coordinates into a Rotate event in the relay log, so that they are durable. sql/slave.h: A couple of coordinates in RELAY_LOG_INFO to keep track of the last ignored events received by the slave I/O thread (ignored because of the server id). mysql-test/r/rpl_dual_pos_advance.result: New BitKeeper file ``mysql-test/r/rpl_dual_pos_advance.result'' mysql-test/t/rpl_dual_pos_advance.test: Test for BUG#13023 (with a part, disabled, to test BUG#13861 when I fix it). Before the fix, this test used to hang.
2005-10-12 13:29:55 +02:00
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
reset master;
change master to master_host="127.0.0.1",master_port=SLAVE_PORT,master_user="root";
start slave;
create table t1 (n int);
BUG#13861 - START SLAVE UNTIL may stop 1 evnt too late if log-slave-updates and circul repl Slave SQL thread may execute one extra event when there are events skipped by slave I/O thread (e.g. originated by the same server). Whereas it was requested not to do so by the UNTIL condition. This happens because we compare with the end position of previously executed event. This is fine when there are no skipped by slave I/O thread events, as end position of previous event equals to start position of to be executed event. Otherwise this position equals to start position of skipped event. This is fixed by: - reading the event to be executed before checking if the until condition is satisfied. - comparing the start position of the event to be executed. Since we do not have the start position available, we compute it by subtracting event length from end position (which is available). - if there are no events on the event queue at the slave sql starting time, that meet until condition, we stop immediately, as in this case we do not want to wait for next event. mysql-test/r/rpl_dual_pos_advance.result: A test case for BUG#13861. mysql-test/t/rpl_dual_pos_advance.test: A test case for BUG#13861. sql/log_event.cc: Store length of event. This is needed for further calculation of the beginning of event. sql/slave.cc: Slave SQL thread may execute one extra event when there are events skipped by slave I/O thread (e.g. originated by the same server). Whereas it was requested not to do so by the UNTIL condition. This happens because we compare with the end position of previously executed event. This is fine when there are no skipped by slave I/O thread events, as end position of previous event equals to start position of to be executed event. Otherwise this position equals to start position of skipped event. This is fixed by: - reading the event to be executed before checking if the until condition is satisfied. - comparing the start position of the event to be executed. Since we do not have the start position available, we compute it by subtracting event length from end position (which is available). - if there are no events on the event queue at the slave sql starting time, that meet until condition, we stop immediately, as in this case we do not want to wait for next event. sql/slave.h: Added master_log_pos parametr to is_until_satisfied(). mysql-test/t/rpl_dual_pos_advance-slave.opt: New BitKeeper file ``mysql-test/t/rpl_dual_pos_advance-slave.opt''
2008-02-22 16:07:07 +01:00
stop slave;
create table t2 (n int);
show tables;
Tables_in_test
t1
t2
create table t3 (n int) engine=innodb;
set @a=1;
insert into t3 values(@a);
begin;
insert into t3 values(2);
insert into t3 values(3);
commit;
insert into t3 values(4);
start slave until master_log_file="slave-bin.000001",master_log_pos=195;
Warnings:
Note 1278 It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart
show tables;
Tables_in_test
t1
t2
start slave until master_log_file="slave-bin.000001",master_log_pos=438;
Warnings:
Note 1278 It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart
select * from t3;
n
1
start slave until master_log_file="slave-bin.000001",master_log_pos=663;
Warnings:
Note 1278 It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart
select * from t3;
n
1
2
3
start slave;
Fix for BUG#13023: "SQL Thread is up but doesn't move forward". Details in slave.cc; in short we now record whenever the slave I/O thread ignores a master's event because of its server id, and use this info in the slave SQL thread to advance Exec_master_log_pos. Because if we do not, this variable stays at the position of the last executed event, i.e. the last *non-ignored* executed one, which may not be the last of the master's binlog (and so the slave *looks* behind the master though it's data-wise it's not). mysql-test/t/rpl_dual_pos_advance-master.opt: empty; its goal is just to trigger a server restart after running the test, so that the master forgets that it was a slave (otherwise it affects the following tests). sql/log.cc: No more default arguments for Rotate_log_event constructor. MYSQL_LOG::appendv() is now called without mutex. sql/log_event.cc: Moving one Rotate_log_event constructor from log_event.h. Support for on-demand choice of duplicating the string argument of the constructor or not (because there now are needs for both alternatives, see slave.cc). sql/log_event.h: We now have a case where a Rotate_log_event is executed by the slave SQL thread while not being in the relay log, so it needs to pretend its length is 0: a ZERO_LEN flag for that; a flag DUP_NAME (replaces "bool alloced") to be able to choose if we want the constructor to duplicate the string argument or not. sql/slave.cc: A comment for BUG#13861 (to be fixed). llstr() instead of %ld as the number is ulonglong. mi->rli becomes rli in some places. Fix for BUG#13023: - in the slave I/O thread, whenever we ignore an event because of its server id we update a couple of coordinates in memory - in the slave SQL thread, whenever we bump into the end of the latest relay log, we check this couple of coordinates to see if we should advance our Exec_master_log_pos. - when the slave I/O thread terminates it saves these in-memory coordinates into a Rotate event in the relay log, so that they are durable. sql/slave.h: A couple of coordinates in RELAY_LOG_INFO to keep track of the last ignored events received by the slave I/O thread (ignored because of the server id). mysql-test/r/rpl_dual_pos_advance.result: New BitKeeper file ``mysql-test/r/rpl_dual_pos_advance.result'' mysql-test/t/rpl_dual_pos_advance.test: Test for BUG#13023 (with a part, disabled, to test BUG#13861 when I fix it). Before the fix, this test used to hang.
2005-10-12 13:29:55 +02:00
create table t4 (n int);
create table t5 (n int);
create table t6 (n int);
show tables;
Tables_in_test
t1
BUG#13861 - START SLAVE UNTIL may stop 1 evnt too late if log-slave-updates and circul repl Slave SQL thread may execute one extra event when there are events skipped by slave I/O thread (e.g. originated by the same server). Whereas it was requested not to do so by the UNTIL condition. This happens because we compare with the end position of previously executed event. This is fine when there are no skipped by slave I/O thread events, as end position of previous event equals to start position of to be executed event. Otherwise this position equals to start position of skipped event. This is fixed by: - reading the event to be executed before checking if the until condition is satisfied. - comparing the start position of the event to be executed. Since we do not have the start position available, we compute it by subtracting event length from end position (which is available). - if there are no events on the event queue at the slave sql starting time, that meet until condition, we stop immediately, as in this case we do not want to wait for next event. mysql-test/r/rpl_dual_pos_advance.result: A test case for BUG#13861. mysql-test/t/rpl_dual_pos_advance.test: A test case for BUG#13861. sql/log_event.cc: Store length of event. This is needed for further calculation of the beginning of event. sql/slave.cc: Slave SQL thread may execute one extra event when there are events skipped by slave I/O thread (e.g. originated by the same server). Whereas it was requested not to do so by the UNTIL condition. This happens because we compare with the end position of previously executed event. This is fine when there are no skipped by slave I/O thread events, as end position of previous event equals to start position of to be executed event. Otherwise this position equals to start position of skipped event. This is fixed by: - reading the event to be executed before checking if the until condition is satisfied. - comparing the start position of the event to be executed. Since we do not have the start position available, we compute it by subtracting event length from end position (which is available). - if there are no events on the event queue at the slave sql starting time, that meet until condition, we stop immediately, as in this case we do not want to wait for next event. sql/slave.h: Added master_log_pos parametr to is_until_satisfied(). mysql-test/t/rpl_dual_pos_advance-slave.opt: New BitKeeper file ``mysql-test/t/rpl_dual_pos_advance-slave.opt''
2008-02-22 16:07:07 +01:00
t2
t3
Fix for BUG#13023: "SQL Thread is up but doesn't move forward". Details in slave.cc; in short we now record whenever the slave I/O thread ignores a master's event because of its server id, and use this info in the slave SQL thread to advance Exec_master_log_pos. Because if we do not, this variable stays at the position of the last executed event, i.e. the last *non-ignored* executed one, which may not be the last of the master's binlog (and so the slave *looks* behind the master though it's data-wise it's not). mysql-test/t/rpl_dual_pos_advance-master.opt: empty; its goal is just to trigger a server restart after running the test, so that the master forgets that it was a slave (otherwise it affects the following tests). sql/log.cc: No more default arguments for Rotate_log_event constructor. MYSQL_LOG::appendv() is now called without mutex. sql/log_event.cc: Moving one Rotate_log_event constructor from log_event.h. Support for on-demand choice of duplicating the string argument of the constructor or not (because there now are needs for both alternatives, see slave.cc). sql/log_event.h: We now have a case where a Rotate_log_event is executed by the slave SQL thread while not being in the relay log, so it needs to pretend its length is 0: a ZERO_LEN flag for that; a flag DUP_NAME (replaces "bool alloced") to be able to choose if we want the constructor to duplicate the string argument or not. sql/slave.cc: A comment for BUG#13861 (to be fixed). llstr() instead of %ld as the number is ulonglong. mi->rli becomes rli in some places. Fix for BUG#13023: - in the slave I/O thread, whenever we ignore an event because of its server id we update a couple of coordinates in memory - in the slave SQL thread, whenever we bump into the end of the latest relay log, we check this couple of coordinates to see if we should advance our Exec_master_log_pos. - when the slave I/O thread terminates it saves these in-memory coordinates into a Rotate event in the relay log, so that they are durable. sql/slave.h: A couple of coordinates in RELAY_LOG_INFO to keep track of the last ignored events received by the slave I/O thread (ignored because of the server id). mysql-test/r/rpl_dual_pos_advance.result: New BitKeeper file ``mysql-test/r/rpl_dual_pos_advance.result'' mysql-test/t/rpl_dual_pos_advance.test: Test for BUG#13023 (with a part, disabled, to test BUG#13861 when I fix it). Before the fix, this test used to hang.
2005-10-12 13:29:55 +02:00
t4
t5
t6
stop slave;
reset slave;
BUG#13861 - START SLAVE UNTIL may stop 1 evnt too late if log-slave-updates and circul repl Slave SQL thread may execute one extra event when there are events skipped by slave I/O thread (e.g. originated by the same server). Whereas it was requested not to do so by the UNTIL condition. This happens because we compare with the end position of previously executed event. This is fine when there are no skipped by slave I/O thread events, as end position of previous event equals to start position of to be executed event. Otherwise this position equals to start position of skipped event. This is fixed by: - reading the event to be executed before checking if the until condition is satisfied. - comparing the start position of the event to be executed. Since we do not have the start position available, we compute it by subtracting event length from end position (which is available). - if there are no events on the event queue at the slave sql starting time, that meet until condition, we stop immediately, as in this case we do not want to wait for next event. mysql-test/r/rpl_dual_pos_advance.result: A test case for BUG#13861. mysql-test/t/rpl_dual_pos_advance.test: A test case for BUG#13861. sql/log_event.cc: Store length of event. This is needed for further calculation of the beginning of event. sql/slave.cc: Slave SQL thread may execute one extra event when there are events skipped by slave I/O thread (e.g. originated by the same server). Whereas it was requested not to do so by the UNTIL condition. This happens because we compare with the end position of previously executed event. This is fine when there are no skipped by slave I/O thread events, as end position of previous event equals to start position of to be executed event. Otherwise this position equals to start position of skipped event. This is fixed by: - reading the event to be executed before checking if the until condition is satisfied. - comparing the start position of the event to be executed. Since we do not have the start position available, we compute it by subtracting event length from end position (which is available). - if there are no events on the event queue at the slave sql starting time, that meet until condition, we stop immediately, as in this case we do not want to wait for next event. sql/slave.h: Added master_log_pos parametr to is_until_satisfied(). mysql-test/t/rpl_dual_pos_advance-slave.opt: New BitKeeper file ``mysql-test/t/rpl_dual_pos_advance-slave.opt''
2008-02-22 16:07:07 +01:00
drop table t1,t2,t3,t4,t5,t6;