diff options
Diffstat (limited to 'sql/sql_repl.cc')
-rw-r--r-- | sql/sql_repl.cc | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index c6384817512..bbe92f3e526 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -690,6 +690,7 @@ int change_master(THD* thd, MASTER_INFO* mi) { int error=0,restart_thread_mask; const char* errmsg=0; + bool need_relay_log_purge=1; // kill slave thread lock_slave_threads(mi); @@ -742,17 +743,47 @@ int change_master(THD* thd, MASTER_INFO* mi) if (lex_mi->connect_retry) mi->connect_retry = lex_mi->connect_retry; + if (lex_mi->relay_log_name) + { + need_relay_log_purge = 0; + strnmov(mi->rli.relay_log_name,lex_mi->relay_log_name, + sizeof(mi->rli.relay_log_name)); + } + + if (lex_mi->relay_log_pos) + { + need_relay_log_purge=0; + mi->rli.relay_log_pos=lex_mi->relay_log_pos; + } + flush_master_info(mi); - pthread_mutex_unlock(&mi->data_lock); - thd->proc_info="purging old relay logs"; - if (purge_relay_logs(&mi->rli,0 /* not only reset, but also reinit*/, - &errmsg)) + if (need_relay_log_purge) { - send_error(&thd->net, 0, "Failed purging old relay logs"); - unlock_slave_threads(mi); - return 1; + pthread_mutex_unlock(&mi->data_lock); + thd->proc_info="purging old relay logs"; + if (purge_relay_logs(&mi->rli,0 /* not only reset, but also reinit*/, + &errmsg)) + { + send_error(&thd->net, 0, "Failed purging old relay logs"); + unlock_slave_threads(mi); + return 1; + } + pthread_mutex_lock(&mi->rli.data_lock); + } + else + { + const char* msg; + if (init_relay_log_pos(&mi->rli,0/*log already inited*/, + 0 /*pos already inited*/, + 0 /*no data lock*/, + &msg)) + { + net_printf(&thd->net,0,"Failed initializing relay log position: %s",msg); + unlock_slave_threads(mi); + return 1; + } + } - pthread_mutex_lock(&mi->rli.data_lock); mi->rli.master_log_pos = mi->master_log_pos; strnmov(mi->rli.master_log_name,mi->master_log_name, sizeof(mi->rli.master_log_name)); |