summaryrefslogtreecommitdiff
path: root/sql/rpl_rli.cc
diff options
context:
space:
mode:
authorSujatha <sujatha.sivakumar@mariadb.com>2020-11-12 13:04:39 +0530
committerSujatha <sujatha.sivakumar@mariadb.com>2020-11-12 13:04:39 +0530
commit984a06db2ce2b2e3c7c5028245905417f2141cd7 (patch)
treeebaa78908f2b70726492b9ac1a69c5496867d308 /sql/rpl_rli.cc
parentdd33a70dad2b32aa6fcdbd1f8161d5351f6dbebd (diff)
downloadmariadb-git-984a06db2ce2b2e3c7c5028245905417f2141cd7.tar.gz
MDEV-4633: multi_source.simple test fails sporadically
Analysis: ======== Writes to 'rli->log_space_total' needs to be synchronized, otherwise both SQL_THREAD and IO_THREAD can try to modify the variable simultaneously resulting in incorrect rli->log_space_total. In the current test scenario SQL_THREAD is trying to decrement 'rli->log_space_total' in 'purge_first_log' and IO_THREAD is trying to increment the 'rli->log_space_total' in 'queue_event' simultaneously. Hence test occasionally fails with result mismatch. Fix: === Convert 'rli->log_space_total' variable to atomic type.
Diffstat (limited to 'sql/rpl_rli.cc')
-rw-r--r--sql/rpl_rli.cc10
1 files changed, 6 insertions, 4 deletions
diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc
index 99f8da2c928..d2d1bc3421d 100644
--- a/sql/rpl_rli.cc
+++ b/sql/rpl_rli.cc
@@ -454,7 +454,8 @@ static inline int add_relay_log(Relay_log_info* rli,LOG_INFO* linfo)
linfo->log_file_name);
DBUG_RETURN(1);
}
- rli->log_space_total += s.st_size;
+ my_atomic_add64_explicit((volatile int64*)(&rli->log_space_total),
+ s.st_size, MY_MEMORY_ORDER_RELAXED);
DBUG_PRINT("info",("log_space_total: %llu", rli->log_space_total));
DBUG_RETURN(0);
}
@@ -464,7 +465,8 @@ static int count_relay_log_space(Relay_log_info* rli)
{
LOG_INFO linfo;
DBUG_ENTER("count_relay_log_space");
- rli->log_space_total= 0;
+ my_atomic_store64_explicit((volatile int64*)(&rli->log_space_total), 0,
+ MY_MEMORY_ORDER_RELAXED);
if (rli->relay_log.find_log_pos(&linfo, NullS, 1))
{
sql_print_error("Could not find first log while counting relay log space");
@@ -1223,8 +1225,8 @@ int purge_relay_logs(Relay_log_info* rli, THD *thd, bool just_reset,
strmake_buf(rli->group_relay_log_name, rli->relay_log.get_log_fname());
strmake_buf(rli->event_relay_log_name, rli->relay_log.get_log_fname());
rli->group_relay_log_pos= rli->event_relay_log_pos= BIN_LOG_HEADER_SIZE;
- rli->log_space_total= 0;
-
+ my_atomic_store64_explicit((volatile int64*)(&rli->log_space_total), 0,
+ MY_MEMORY_ORDER_RELAXED);
if (count_relay_log_space(rli))
{
*errmsg= "Error counting relay log space";