summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorLuis Soares <luis.soares@sun.com>2010-02-03 17:19:58 +0000
committerLuis Soares <luis.soares@sun.com>2010-02-03 17:19:58 +0000
commit6dd801d7b7b813382c304f0787709031897af1dc (patch)
treed4c383865865c897dc5f361924955f2260e97db1 /sql
parentac8e3fee1e88d826e80bc38a8e6813cf2911afb1 (diff)
parentd0ffa8e51b104839a9e397aacda8ca1f110e3fad (diff)
downloadmariadb-git-6dd801d7b7b813382c304f0787709031897af1dc.tar.gz
BUG#50364: manual merge to mysql-next-mr-bugfixing.
Conflicts ========= Text conflict in sql/repl_failsafe.cc Additional changes ================== Replace references to pthread_mutex with mysql_mutex
Diffstat (limited to 'sql')
-rw-r--r--sql/rpl_mi.cc19
-rw-r--r--sql/rpl_mi.h4
-rw-r--r--sql/rpl_rli.cc2
-rw-r--r--sql/slave.cc6
-rw-r--r--sql/sql_repl.cc2
5 files changed, 24 insertions, 9 deletions
diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc
index 7f81834c1d3..7dad340cfa6 100644
--- a/sql/rpl_mi.cc
+++ b/sql/rpl_mi.cc
@@ -369,7 +369,7 @@ file '%s')", fname);
mi->rli.is_relay_log_recovery= FALSE;
// now change cache READ -> WRITE - must do this before flush_master_info
reinit_io_cache(&mi->file, WRITE_CACHE, 0L, 0, 1);
- if ((error=test(flush_master_info(mi, 1))))
+ if ((error=test(flush_master_info(mi, TRUE, TRUE))))
sql_print_error("Failed to flush master info file");
mysql_mutex_unlock(&mi->data_lock);
DBUG_RETURN(error);
@@ -395,7 +395,9 @@ err:
1 - flush master info failed
0 - all ok
*/
-int flush_master_info(Master_info* mi, bool flush_relay_log_cache)
+int flush_master_info(Master_info* mi,
+ bool flush_relay_log_cache,
+ bool need_lock_relay_log)
{
IO_CACHE* file = &mi->file;
char lbuf[22];
@@ -418,8 +420,19 @@ int flush_master_info(Master_info* mi, bool flush_relay_log_cache)
*/
if (flush_relay_log_cache)
{
+ mysql_mutex_t *log_lock= mi->rli.relay_log.get_log_lock();
IO_CACHE *log_file= mi->rli.relay_log.get_log_file();
- if (flush_io_cache(log_file))
+
+ if (need_lock_relay_log)
+ mysql_mutex_lock(log_lock);
+
+ mysql_mutex_assert_owner(log_lock);
+ err= flush_io_cache(log_file);
+
+ if (need_lock_relay_log)
+ mysql_mutex_unlock(log_lock);
+
+ if (err)
DBUG_RETURN(2);
}
diff --git a/sql/rpl_mi.h b/sql/rpl_mi.h
index 6dd9fab7904..c4ca5714306 100644
--- a/sql/rpl_mi.h
+++ b/sql/rpl_mi.h
@@ -119,7 +119,9 @@ int init_master_info(Master_info* mi, const char* master_info_fname,
bool abort_if_no_master_info_file,
int thread_mask);
void end_master_info(Master_info* mi);
-int flush_master_info(Master_info* mi, bool flush_relay_log_cache);
+int flush_master_info(Master_info* mi,
+ bool flush_relay_log_cache,
+ bool need_lock_relay_log);
int change_master_server_id_cmp(ulong *id1, ulong *id2);
#endif /* HAVE_REPLICATION */
diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc
index a982cfd25a4..1b3c25dfda2 100644
--- a/sql/rpl_rli.cc
+++ b/sql/rpl_rli.cc
@@ -123,7 +123,7 @@ int init_relay_log_info(Relay_log_info* rli,
/*
The relay log will now be opened, as a SEQ_READ_APPEND IO_CACHE.
Note that the I/O thread flushes it to disk after writing every
- event, in flush_master_info(mi, 1).
+ event, in flush_master_info(mi, 1, ?).
*/
/*
diff --git a/sql/slave.cc b/sql/slave.cc
index af43b39c63b..c7469d41a26 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -510,7 +510,7 @@ int terminate_slave_threads(Master_info* mi,int thread_mask,bool skip_lock)
DBUG_PRINT("info",("Flushing relay log and master info file."));
if (current_thd)
thd_proc_info(current_thd, "Flushing relay log and master info files.");
- if (flush_master_info(mi, TRUE /* flush relay log */))
+ if (flush_master_info(mi, TRUE, FALSE))
DBUG_RETURN(ER_ERROR_DURING_FLUSH_LOGS);
if (my_sync(mi->rli.relay_log.get_log_file()->file, MYF(MY_WME)))
@@ -1601,7 +1601,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;
}
@@ -2928,7 +2928,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;
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index 1fb0fcaf6dd..fe3f17f57a0 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -1522,7 +1522,7 @@ bool change_master(THD* thd, Master_info* mi)
Relay log's IO_CACHE may not be inited, if rli->inited==0 (server was never
a slave before).
*/
- if (flush_master_info(mi, 0))
+ if (flush_master_info(mi, FALSE, FALSE))
{
my_error(ER_RELAY_LOG_INIT, MYF(0), "Failed to flush master info file");
ret= TRUE;