summaryrefslogtreecommitdiff
path: root/sql/slave.cc
diff options
context:
space:
mode:
authorLuis Soares <luis.soares@sun.com>2010-02-03 16:56:17 +0000
committerLuis Soares <luis.soares@sun.com>2010-02-03 16:56:17 +0000
commit55aab082a957e3f20e94f791dbe44750b4b465c8 (patch)
tree0830be99ef4b6b308d020c571711d5f5a06e04f9 /sql/slave.cc
parent54fc7997e217c7556f06693f1d04caf5ce8ca36b (diff)
downloadmariadb-git-55aab082a957e3f20e94f791dbe44750b4b465c8.tar.gz
BUG#50364: FLUSH LOGS crashes the server (rpl.rpl_heartbeat_basic
fails in PB sporadically) The IO thread can concurrently access the relay log IO_CACHE while another thread is performing an FLUSH LOGS procedure. FLUSH LOGS closes and reopens the relay log and while doing so it (re)initializes its IO_CACHE. During this procedure the IO_CACHE mutex is also reinitialized, which can cause problems if some other thread (namely the IO THREAD) is concurrently accessing it at the time . This patch fixes the problem by extending the interface of the flush_master_info function to also include a second paramater, "need_relay_log_lock", stating whether the thread should grab the relay log lock or not before actually flushing the relay log. Also, IO thread now calls flush_master_info with this flag set when it flushes master info with in the event read_event loop. Finally, we also increase loop time in rpl_heartbeat_basic test case, so that the number of calls to flush logs doubles, stressing this part of the code a little more. mysql-test/suite/rpl/t/rpl_heartbeat_basic.test: Doubled the number of iterations on the FLUSH LOGS loop by doubling the time available to perform all iterations. sql/repl_failsafe.cc: Updating flush_master_info call so that it uses two parameters instead of one. sql/rpl_mi.cc: Updating flush_master_info call so that it uses two parameters instead of one. sql/rpl_mi.h: Changed flush_master_info interface. Now takes a second parameter instead of just one. The second parameter is: need_lock_relay_log. sql/rpl_rli.cc: Small fix in comment. sql/slave.cc: Updating flush_master_info call so that it uses two parameters instead of one. sql/sql_repl.cc: Updating flush_master_info call so that it uses two parameters instead of one.
Diffstat (limited to 'sql/slave.cc')
-rw-r--r--sql/slave.cc4
1 files changed, 2 insertions, 2 deletions
diff --git a/sql/slave.cc b/sql/slave.cc
index 27f87d18800..3678c2497de 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -1726,7 +1726,7 @@ static void write_ignored_events_info_to_relay_log(THD *thd, Master_info *mi)
" to the relay log, SHOW SLAVE STATUS may be"
" inaccurate");
rli->relay_log.harvest_bytes_written(&rli->log_space_total);
- if (flush_master_info(mi, 1))
+ if (flush_master_info(mi, TRUE, FALSE))
sql_print_error("Failed to flush master info file");
delete ev;
}
@@ -3047,7 +3047,7 @@ Stopping slave I/O thread due to out-of-memory error from master");
goto err;
}
- if (flush_master_info(mi, 1))
+ if (flush_master_info(mi, TRUE, TRUE))
{
sql_print_error("Failed to flush master info file");
goto err;