Skip to content

Commit b739103

Browse files
committed
MDEV-7591 master crashed when slave specfied a future position with semi-repl plugin
cherry-pick the upstream fix commit d4ba10184cd7bde9c31c610e664ecd0c93605c46 Author: Sujatha Sivakumar <sujatha.sivakumar@oracle.com> Date: Wed Jul 2 11:34:11 2014 +0530 Bug#17453826:ASSERTION ERROR WHEN SETTING FUTURE BINLOG FILE/POS WITH SEMISYNC Problem: ======== When DMLs are in progress on the master stopping a slave and setting ahead binlog name/pos will cause an assert on the master. ...
1 parent 22cf2f1 commit b739103

File tree

3 files changed

+66
-12
lines changed

3 files changed

+66
-12
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
include/master-slave.inc
2+
[connection master]
3+
call mtr.add_suppression("Timeout waiting for reply of binlog*");
4+
create table t1 (i int);
5+
set global rpl_semi_sync_master_enabled = ON;
6+
include/stop_slave.inc
7+
set global rpl_semi_sync_slave_enabled = ON;
8+
change master to master_log_file='master-bin.000002', master_log_pos = 320;
9+
start slave;
10+
include/wait_for_slave_io_error.inc [errno=1236]
11+
insert into t1 values (1);
12+
reset master;
13+
include/stop_slave.inc
14+
reset slave;
15+
include/start_slave.inc
16+
set global rpl_semi_sync_slave_enabled = OFF;
17+
drop table t1;
18+
set global rpl_semi_sync_master_enabled = OFF;
19+
include/rpl_end.inc
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--source include/have_semisync.inc
2+
--source include/master-slave.inc
3+
4+
call mtr.add_suppression("Timeout waiting for reply of binlog*");
5+
create table t1 (i int);
6+
7+
set global rpl_semi_sync_master_enabled = ON;
8+
9+
--connection slave
10+
--source include/stop_slave.inc
11+
set global rpl_semi_sync_slave_enabled = ON;
12+
change master to master_log_file='master-bin.000002', master_log_pos = 320;
13+
14+
start slave;
15+
--let $slave_io_errno=1236
16+
--source include/wait_for_slave_io_error.inc
17+
18+
--connection master
19+
insert into t1 values (1);
20+
reset master;
21+
22+
--connection slave
23+
--source include/stop_slave.inc
24+
reset slave;
25+
--source include/start_slave.inc
26+
27+
set global rpl_semi_sync_slave_enabled = OFF;
28+
--connection master
29+
drop table t1;
30+
set global rpl_semi_sync_master_enabled = OFF;
31+
--source include/rpl_end.inc

sql/sql_repl.cc

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1948,6 +1948,7 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos,
19481948
slave_connection_state until_gtid_state_obj;
19491949
rpl_gtid error_gtid;
19501950
binlog_send_info info(thd, packet, flags, log_file_name);
1951+
bool has_transmit_started= false;
19511952

19521953
int old_max_allowed_packet= thd->variables.max_allowed_packet;
19531954

@@ -2007,16 +2008,6 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos,
20072008
DBUG_SET("+d,corrupt_read_log_event2");
20082009
});
20092010

2010-
if (global_system_variables.log_warnings > 1)
2011-
sql_print_information("Start binlog_dump to slave_server(%lu), pos(%s, %lu)",
2012-
thd->variables.server_id, log_ident, (ulong)pos);
2013-
if (RUN_HOOK(binlog_transmit, transmit_start, (thd, flags, log_ident, pos)))
2014-
{
2015-
errmsg= "Failed to run hook 'transmit_start'";
2016-
my_errno= ER_UNKNOWN_ERROR;
2017-
goto err;
2018-
}
2019-
20202011
#ifndef DBUG_OFF
20212012
if (opt_sporadic_binlog_dump_fail && (binlog_dump_count++ % 2))
20222013
{
@@ -2113,6 +2104,17 @@ impossible position";
21132104
goto err;
21142105
}
21152106

2107+
if (global_system_variables.log_warnings > 1)
2108+
sql_print_information("Start binlog_dump to slave_server(%lu), pos(%s, %lu)",
2109+
thd->variables.server_id, log_ident, (ulong)pos);
2110+
if (RUN_HOOK(binlog_transmit, transmit_start, (thd, flags, log_ident, pos)))
2111+
{
2112+
errmsg= "Failed to run hook 'transmit_start'";
2113+
my_errno= ER_UNKNOWN_ERROR;
2114+
goto err;
2115+
}
2116+
has_transmit_started= true;
2117+
21162118
/* reset transmit packet for the fake rotate event below */
21172119
if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
21182120
goto err;
@@ -2680,7 +2682,8 @@ impossible position";
26802682
end_io_cache(&log);
26812683
mysql_file_close(file, MYF(MY_WME));
26822684

2683-
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
2685+
if (has_transmit_started)
2686+
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
26842687
my_eof(thd);
26852688
THD_STAGE_INFO(thd, stage_waiting_to_finalize_termination);
26862689
mysql_mutex_lock(&LOCK_thread_count);
@@ -2749,7 +2752,8 @@ impossible position";
27492752
else
27502753
strcpy(error_text, errmsg);
27512754
end_io_cache(&log);
2752-
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
2755+
if (has_transmit_started)
2756+
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
27532757
/*
27542758
Exclude iteration through thread list
27552759
this is needed for purge_logs() - it will iterate through

0 commit comments

Comments
 (0)