Commit 9d78adc1 authored by unknown's avatar unknown
Browse files

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.


mysql-test/r/rpl000009.result:
  result update
mysql-test/t/rpl000009.test:
  adding a test for RESET SLAVE + LOAD DATA FROM MASTER
sql/repl_failsafe.cc:
  LOAD DATA FROM MASTER udpates the master info in the slave,
  so needs to ensure that it is properly inited first
  (otherwise, after RESET SLAVE, we are flush_io_cache()ing
  an uninitialized IO_CACHE master.info).
  Note that it master info is already inited (active_mi->inited==1),
  init_master_info() will do nothing, which is what we want.
parent e9eb0239
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -111,6 +111,18 @@ n s
2	two bar
3	three 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;
Table 't1' already exists
drop table bar.t1;
+15 −0
Original line number Diff line number Diff line
@@ -108,6 +108,21 @@ connection slave;
sync_with_master;
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
# table to be overwritten.
# DISABLED FOR NOW AS chmod IS NOT PORTABLE ON NON-UNIX
+10 −2
Original line number Diff line number Diff line
@@ -874,7 +874,7 @@ int load_master_data(THD* thd)

    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)
    {
      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 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],
		sizeof(active_mi->master_log_name));
	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)
	  active_mi->master_log_pos = BIN_LOG_HEADER_SIZE;
	active_mi->rli.pending = 0;