summaryrefslogtreecommitdiff
path: root/sql/sql_repl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_repl.cc')
-rw-r--r--sql/sql_repl.cc47
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));