Skip to content

Commit 51eaa7f

Browse files
committed
MDEV-8193: UNTIL clause in START SLAVE is sporadically disobeyed by parallel replication
The code was using the wrong variable when comparing the binlog name for the UNTIL position. This could cause the comparison to fail after binlog rotation, in turn causing the UNTIL clause to not trigger slave stop.
1 parent 09bfaf3 commit 51eaa7f

File tree

4 files changed

+83
-3
lines changed

4 files changed

+83
-3
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
include/master-slave.inc
2+
[connection master]
3+
include/stop_slave_sql.inc
4+
CALL mtr.add_suppression("Statement is unsafe because it uses a system function that may return a different value on the slave");
5+
create table t1 (i int);
6+
insert into t1 values (1),(2);
7+
insert into t1 values (3),(4);
8+
insert into t1 select i+20+0*sleep(1) from t1 where i=1;
9+
Warnings:
10+
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave.
11+
flush logs;
12+
insert into t1 values (5),(6);
13+
insert into t1 values (7),(8);
14+
insert into t1 values (9),(10);
15+
insert into t1 values (11),(12);
16+
insert into t1 values (13),(14);
17+
insert into t1 values (15),(16);
18+
set global slave_parallel_threads = 1;
19+
start slave until master_log_file='MASTER_FILE', master_log_pos=MASTER_POS;
20+
drop table t1;
21+
include/stop_slave_io.inc
22+
set global slave_parallel_threads = DEFAULT;
23+
drop table t1;
24+
include/rpl_end.inc
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
--source include/master-slave.inc
2+
--source include/have_binlog_format_statement.inc
3+
4+
--connection slave
5+
6+
--source include/stop_slave_sql.inc
7+
8+
--connection master
9+
10+
CALL mtr.add_suppression("Statement is unsafe because it uses a system function that may return a different value on the slave");
11+
create table t1 (i int);
12+
insert into t1 values (1),(2);
13+
insert into t1 values (3),(4);
14+
# This sleep() helps trigger the failure more reliably.
15+
insert into t1 select i+20+0*sleep(1) from t1 where i=1;
16+
flush logs;
17+
insert into t1 values (5),(6);
18+
insert into t1 values (7),(8);
19+
insert into t1 values (9),(10);
20+
21+
--let $master_file = query_get_value(show master status,File,1)
22+
--let $master_pos = query_get_value(show master status,Position,1)
23+
24+
insert into t1 values (11),(12);
25+
insert into t1 values (13),(14);
26+
insert into t1 values (15),(16);
27+
28+
--connection slave
29+
30+
set global slave_parallel_threads = 1;
31+
--replace_result $master_file MASTER_FILE $master_pos MASTER_POS
32+
eval start slave until master_log_file='$master_file', master_log_pos=$master_pos;
33+
34+
--let $show_statement = SHOW SLAVE STATUS
35+
--let $field = Slave_SQL_Running
36+
--let $condition = = 'No'
37+
--let $wait_timeout = 10
38+
39+
--source include/wait_show_condition.inc
40+
41+
if (`select COUNT(*) <> 11 from t1`)
42+
{
43+
SELECT * FROM t1;
44+
query_vertical show slave status;
45+
die "Wrong number of rows in the table";
46+
}
47+
48+
drop table t1;
49+
--source include/stop_slave_io.inc
50+
set global slave_parallel_threads = DEFAULT;
51+
52+
--connection master
53+
drop table t1;
54+
55+
--let $rpl_only_running_threads= 1
56+
--source include/rpl_end.inc

sql/rpl_parallel.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ handle_queued_pos_update(THD *thd, rpl_parallel_thread::queued_event *qev)
9595
if (cmp < 0)
9696
{
9797
strcpy(rli->group_master_log_name, qev->future_event_master_log_name);
98-
rli->notify_group_master_log_name_update();
9998
rli->group_master_log_pos= qev->future_event_master_log_pos;
10099
}
101100
else if (cmp == 0
@@ -2065,6 +2064,7 @@ rpl_parallel::do_event(rpl_group_info *serial_rgi, Log_event *ev,
20652064
{
20662065
memcpy(rli->future_event_master_log_name,
20672066
rev->new_log_ident, rev->ident_len+1);
2067+
rli->notify_group_master_log_name_update();
20682068
}
20692069
}
20702070

sql/rpl_rli.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -996,7 +996,6 @@ void Relay_log_info::inc_group_relay_log_pos(ulonglong log_pos,
996996
if (cmp < 0)
997997
{
998998
strcpy(group_master_log_name, rgi->future_event_master_log_name);
999-
notify_group_master_log_name_update();
1000999
group_master_log_pos= log_pos;
10011000
}
10021001
else if (group_master_log_pos < log_pos)
@@ -1218,7 +1217,8 @@ bool Relay_log_info::is_until_satisfied(THD *thd, Log_event *ev)
12181217
if (ev && ev->server_id == (uint32) global_system_variables.server_id &&
12191218
!replicate_same_server_id)
12201219
DBUG_RETURN(FALSE);
1221-
log_name= group_master_log_name;
1220+
log_name= (opt_slave_parallel_threads > 0 ?
1221+
future_event_master_log_name : group_master_log_name);
12221222
log_pos= ((!ev)? group_master_log_pos :
12231223
(get_flag(IN_TRANSACTION) || !ev->log_pos) ?
12241224
group_master_log_pos : ev->log_pos - ev->data_written);

0 commit comments

Comments
 (0)