Commit 77dc2549 authored by SergeyV@selena's avatar SergeyV@selena

Fix for the patch #13377. Avoids race condition for relay logs close.

Code that closes current relay log is moved to purge_relay_logs().
parent bb154252
...@@ -582,6 +582,20 @@ int purge_relay_logs(RELAY_LOG_INFO* rli, THD *thd, bool just_reset, ...@@ -582,6 +582,20 @@ int purge_relay_logs(RELAY_LOG_INFO* rli, THD *thd, bool just_reset,
rli->slave_skip_counter=0; rli->slave_skip_counter=0;
pthread_mutex_lock(&rli->data_lock); pthread_mutex_lock(&rli->data_lock);
/*
we close the relay log fd possibly left open by the slave SQL thread,
to be able to delete it; the relay log fd possibly left open by the slave
I/O thread will be closed naturally in reset_logs() by the
close(LOG_CLOSE_TO_BE_OPENED) call
*/
if (rli->cur_log_fd >= 0)
{
end_io_cache(&rli->cache_buf);
my_close(rli->cur_log_fd, MYF(MY_WME));
rli->cur_log_fd= -1;
}
if (rli->relay_log.reset_logs(thd)) if (rli->relay_log.reset_logs(thd))
{ {
*errmsg = "Failed during log reset"; *errmsg = "Failed during log reset";
...@@ -3692,14 +3706,6 @@ log space"); ...@@ -3692,14 +3706,6 @@ log space");
mi->slave_running = 0; mi->slave_running = 0;
mi->io_thd = 0; mi->io_thd = 0;
/* Close log file and free buffers */
if (mi->rli.cur_log_fd >= 0)
{
end_io_cache(&mi->rli.cache_buf);
my_close(mi->rli.cur_log_fd, MYF(MY_WME));
mi->rli.cur_log_fd= -1;
}
/* Forget the relay log's format */ /* Forget the relay log's format */
delete mi->rli.relay_log.description_event_for_queue; delete mi->rli.relay_log.description_event_for_queue;
mi->rli.relay_log.description_event_for_queue= 0; mi->rli.relay_log.description_event_for_queue= 0;
...@@ -3916,14 +3922,6 @@ the slave SQL thread with \"SLAVE START\". We stopped at log \ ...@@ -3916,14 +3922,6 @@ the slave SQL thread with \"SLAVE START\". We stopped at log \
rli->cached_charset_invalidate(); rli->cached_charset_invalidate();
rli->save_temporary_tables = thd->temporary_tables; rli->save_temporary_tables = thd->temporary_tables;
/* Close log file and free buffers if it's already open */
if (rli->cur_log_fd >= 0)
{
end_io_cache(&rli->cache_buf);
my_close(rli->cur_log_fd, MYF(MY_WME));
rli->cur_log_fd = -1;
}
/* /*
TODO: see if we can do this conditionally in next_event() instead TODO: see if we can do this conditionally in next_event() instead
to avoid unneeded position re-init to avoid unneeded position re-init
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment