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. ...
This commit is contained in:
parent
22cf2f117a
commit
b739103f12
19
mysql-test/suite/rpl/r/semisync_future-7591.result
Normal file
19
mysql-test/suite/rpl/r/semisync_future-7591.result
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
include/master-slave.inc
|
||||||
|
[connection master]
|
||||||
|
call mtr.add_suppression("Timeout waiting for reply of binlog*");
|
||||||
|
create table t1 (i int);
|
||||||
|
set global rpl_semi_sync_master_enabled = ON;
|
||||||
|
include/stop_slave.inc
|
||||||
|
set global rpl_semi_sync_slave_enabled = ON;
|
||||||
|
change master to master_log_file='master-bin.000002', master_log_pos = 320;
|
||||||
|
start slave;
|
||||||
|
include/wait_for_slave_io_error.inc [errno=1236]
|
||||||
|
insert into t1 values (1);
|
||||||
|
reset master;
|
||||||
|
include/stop_slave.inc
|
||||||
|
reset slave;
|
||||||
|
include/start_slave.inc
|
||||||
|
set global rpl_semi_sync_slave_enabled = OFF;
|
||||||
|
drop table t1;
|
||||||
|
set global rpl_semi_sync_master_enabled = OFF;
|
||||||
|
include/rpl_end.inc
|
31
mysql-test/suite/rpl/t/semisync_future-7591.test
Normal file
31
mysql-test/suite/rpl/t/semisync_future-7591.test
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
--source include/have_semisync.inc
|
||||||
|
--source include/master-slave.inc
|
||||||
|
|
||||||
|
call mtr.add_suppression("Timeout waiting for reply of binlog*");
|
||||||
|
create table t1 (i int);
|
||||||
|
|
||||||
|
set global rpl_semi_sync_master_enabled = ON;
|
||||||
|
|
||||||
|
--connection slave
|
||||||
|
--source include/stop_slave.inc
|
||||||
|
set global rpl_semi_sync_slave_enabled = ON;
|
||||||
|
change master to master_log_file='master-bin.000002', master_log_pos = 320;
|
||||||
|
|
||||||
|
start slave;
|
||||||
|
--let $slave_io_errno=1236
|
||||||
|
--source include/wait_for_slave_io_error.inc
|
||||||
|
|
||||||
|
--connection master
|
||||||
|
insert into t1 values (1);
|
||||||
|
reset master;
|
||||||
|
|
||||||
|
--connection slave
|
||||||
|
--source include/stop_slave.inc
|
||||||
|
reset slave;
|
||||||
|
--source include/start_slave.inc
|
||||||
|
|
||||||
|
set global rpl_semi_sync_slave_enabled = OFF;
|
||||||
|
--connection master
|
||||||
|
drop table t1;
|
||||||
|
set global rpl_semi_sync_master_enabled = OFF;
|
||||||
|
--source include/rpl_end.inc
|
@ -1948,6 +1948,7 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos,
|
|||||||
slave_connection_state until_gtid_state_obj;
|
slave_connection_state until_gtid_state_obj;
|
||||||
rpl_gtid error_gtid;
|
rpl_gtid error_gtid;
|
||||||
binlog_send_info info(thd, packet, flags, log_file_name);
|
binlog_send_info info(thd, packet, flags, log_file_name);
|
||||||
|
bool has_transmit_started= false;
|
||||||
|
|
||||||
int old_max_allowed_packet= thd->variables.max_allowed_packet;
|
int old_max_allowed_packet= thd->variables.max_allowed_packet;
|
||||||
|
|
||||||
@ -2007,16 +2008,6 @@ void mysql_binlog_send(THD* thd, char* log_ident, my_off_t pos,
|
|||||||
DBUG_SET("+d,corrupt_read_log_event2");
|
DBUG_SET("+d,corrupt_read_log_event2");
|
||||||
});
|
});
|
||||||
|
|
||||||
if (global_system_variables.log_warnings > 1)
|
|
||||||
sql_print_information("Start binlog_dump to slave_server(%lu), pos(%s, %lu)",
|
|
||||||
thd->variables.server_id, log_ident, (ulong)pos);
|
|
||||||
if (RUN_HOOK(binlog_transmit, transmit_start, (thd, flags, log_ident, pos)))
|
|
||||||
{
|
|
||||||
errmsg= "Failed to run hook 'transmit_start'";
|
|
||||||
my_errno= ER_UNKNOWN_ERROR;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
if (opt_sporadic_binlog_dump_fail && (binlog_dump_count++ % 2))
|
if (opt_sporadic_binlog_dump_fail && (binlog_dump_count++ % 2))
|
||||||
{
|
{
|
||||||
@ -2113,6 +2104,17 @@ impossible position";
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (global_system_variables.log_warnings > 1)
|
||||||
|
sql_print_information("Start binlog_dump to slave_server(%lu), pos(%s, %lu)",
|
||||||
|
thd->variables.server_id, log_ident, (ulong)pos);
|
||||||
|
if (RUN_HOOK(binlog_transmit, transmit_start, (thd, flags, log_ident, pos)))
|
||||||
|
{
|
||||||
|
errmsg= "Failed to run hook 'transmit_start'";
|
||||||
|
my_errno= ER_UNKNOWN_ERROR;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
has_transmit_started= true;
|
||||||
|
|
||||||
/* reset transmit packet for the fake rotate event below */
|
/* reset transmit packet for the fake rotate event below */
|
||||||
if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
|
if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg))
|
||||||
goto err;
|
goto err;
|
||||||
@ -2680,7 +2682,8 @@ end:
|
|||||||
end_io_cache(&log);
|
end_io_cache(&log);
|
||||||
mysql_file_close(file, MYF(MY_WME));
|
mysql_file_close(file, MYF(MY_WME));
|
||||||
|
|
||||||
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
|
if (has_transmit_started)
|
||||||
|
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
|
||||||
my_eof(thd);
|
my_eof(thd);
|
||||||
THD_STAGE_INFO(thd, stage_waiting_to_finalize_termination);
|
THD_STAGE_INFO(thd, stage_waiting_to_finalize_termination);
|
||||||
mysql_mutex_lock(&LOCK_thread_count);
|
mysql_mutex_lock(&LOCK_thread_count);
|
||||||
@ -2749,7 +2752,8 @@ err:
|
|||||||
else
|
else
|
||||||
strcpy(error_text, errmsg);
|
strcpy(error_text, errmsg);
|
||||||
end_io_cache(&log);
|
end_io_cache(&log);
|
||||||
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
|
if (has_transmit_started)
|
||||||
|
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
|
||||||
/*
|
/*
|
||||||
Exclude iteration through thread list
|
Exclude iteration through thread list
|
||||||
this is needed for purge_logs() - it will iterate through
|
this is needed for purge_logs() - it will iterate through
|
||||||
|
Loading…
x
Reference in New Issue
Block a user