diff options
author | unknown <guilhem@mysql.com> | 2004-03-17 10:35:03 +0100 |
---|---|---|
committer | unknown <guilhem@mysql.com> | 2004-03-17 10:35:03 +0100 |
commit | 9d78adc16fa0141921395be232348af8ef8c9181 (patch) | |
tree | c33f645c0ede61c2f00434dcae9577d092d0862d /sql/repl_failsafe.cc | |
parent | e9eb02398cb1883081117be0c4f3334d6634724e (diff) | |
download | mariadb-git-9d78adc16fa0141921395be232348af8ef8c9181.tar.gz |
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.
Diffstat (limited to 'sql/repl_failsafe.cc')
-rw-r--r-- | sql/repl_failsafe.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sql/repl_failsafe.cc b/sql/repl_failsafe.cc index e687b227946..1edf452d5f6 100644 --- a/sql/repl_failsafe.cc +++ b/sql/repl_failsafe.cc @@ -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; |