mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for BUG#2922 "Crash (signal11) after "load data from master""
with a testcase. We needed to init_master_info before we flush_master_info in LOAD DATA FROM MASTER.
This commit is contained in:
@ -111,6 +111,18 @@ n s
|
|||||||
2 two bar
|
2 two bar
|
||||||
3 three bar
|
3 three bar
|
||||||
4 four bar
|
4 four bar
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
load data from master;
|
||||||
|
start slave;
|
||||||
|
insert into bar.t1 values (5, 'five bar');
|
||||||
|
select * from bar.t1;
|
||||||
|
n s
|
||||||
|
1 one bar
|
||||||
|
2 two bar
|
||||||
|
3 three bar
|
||||||
|
4 four bar
|
||||||
|
5 five bar
|
||||||
load table bar.t1 from master;
|
load table bar.t1 from master;
|
||||||
Table 't1' already exists
|
Table 't1' already exists
|
||||||
drop table bar.t1;
|
drop table bar.t1;
|
||||||
|
@ -108,6 +108,21 @@ connection slave;
|
|||||||
sync_with_master;
|
sync_with_master;
|
||||||
select * from bar.t1;
|
select * from bar.t1;
|
||||||
|
|
||||||
|
# Check that LOAD DATA FROM MASTER is able to create master.info
|
||||||
|
# if needed (if RESET SLAVE was used before), before writing to it (BUG#2922).
|
||||||
|
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
load data from master;
|
||||||
|
start slave;
|
||||||
|
# see if replication coordinates were restored fine
|
||||||
|
connection master;
|
||||||
|
insert into bar.t1 values (5, 'five bar');
|
||||||
|
save_master_pos;
|
||||||
|
connection slave;
|
||||||
|
sync_with_master;
|
||||||
|
select * from bar.t1;
|
||||||
|
|
||||||
# Check that LOAD DATA FROM MASTER reports the error if it can't drop a
|
# Check that LOAD DATA FROM MASTER reports the error if it can't drop a
|
||||||
# table to be overwritten.
|
# table to be overwritten.
|
||||||
# DISABLED FOR NOW AS chmod IS NOT PORTABLE ON NON-UNIX
|
# DISABLED FOR NOW AS chmod IS NOT PORTABLE ON NON-UNIX
|
||||||
|
@ -874,7 +874,7 @@ int load_master_data(THD* thd)
|
|||||||
|
|
||||||
cleanup_mysql_results(db_res, cur_table_res - 1, table_res);
|
cleanup_mysql_results(db_res, cur_table_res - 1, table_res);
|
||||||
|
|
||||||
// adjust position in the master
|
// adjust replication coordinates from the master
|
||||||
if (master_status_res)
|
if (master_status_res)
|
||||||
{
|
{
|
||||||
MYSQL_ROW row = mc_mysql_fetch_row(master_status_res);
|
MYSQL_ROW row = mc_mysql_fetch_row(master_status_res);
|
||||||
@ -887,10 +887,18 @@ int load_master_data(THD* thd)
|
|||||||
*/
|
*/
|
||||||
if (row && row[0] && row[1])
|
if (row && row[0] && row[1])
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
If the slave's master info is not inited, we init it, then we write
|
||||||
|
the new coordinates to it. Must call init_master_info() *before*
|
||||||
|
setting active_mi, because init_master_info() sets active_mi with
|
||||||
|
defaults.
|
||||||
|
*/
|
||||||
|
if (init_master_info(active_mi, master_info_file, relay_log_info_file, 0))
|
||||||
|
send_error(&thd->net, ER_MASTER_INFO);
|
||||||
strmake(active_mi->master_log_name, row[0],
|
strmake(active_mi->master_log_name, row[0],
|
||||||
sizeof(active_mi->master_log_name));
|
sizeof(active_mi->master_log_name));
|
||||||
active_mi->master_log_pos = strtoull(row[1], (char**) 0, 10);
|
active_mi->master_log_pos = strtoull(row[1], (char**) 0, 10);
|
||||||
// don't hit the magic number
|
// at least in recent versions, the condition below should be false
|
||||||
if (active_mi->master_log_pos < BIN_LOG_HEADER_SIZE)
|
if (active_mi->master_log_pos < BIN_LOG_HEADER_SIZE)
|
||||||
active_mi->master_log_pos = BIN_LOG_HEADER_SIZE;
|
active_mi->master_log_pos = BIN_LOG_HEADER_SIZE;
|
||||||
active_mi->rli.pending = 0;
|
active_mi->rli.pending = 0;
|
||||||
|
Reference in New Issue
Block a user