Merged BUG#12574820 from 5.1 to 5.5
Two conflicts resolved manually: Text conflict in sql/log.cc Text conflict in sql/mysqld.cc
This commit is contained in:
commit
6ffc69e0c8
1
mysql-test/suite/binlog/r/binlog_reset_master.result
Normal file
1
mysql-test/suite/binlog/r/binlog_reset_master.result
Normal file
@ -0,0 +1 @@
|
||||
RESET MASTER;
|
26
mysql-test/suite/binlog/t/binlog_reset_master.test
Normal file
26
mysql-test/suite/binlog/t/binlog_reset_master.test
Normal file
@ -0,0 +1,26 @@
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Test bugs in RESET MASTER.
|
||||
|
||||
--source include/have_debug.inc
|
||||
--source include/have_log_bin.inc
|
||||
|
||||
#######################################################################
|
||||
# BUG#12574820: binlog.binlog_tmp_table timing out in daily and weekly trunk run
|
||||
# Problem: MYSQL_BIN_LOG::reset_logs acquired LOCK_thread_count and
|
||||
# LOCK_log in the wrong order. This could cause a deadlock when
|
||||
# RESET MASTER was run concurrently with a disconnecting thread.
|
||||
#######################################################################
|
||||
|
||||
# We use sleep, not debug_sync, because the sync point needs to be in
|
||||
# the thread shut down code after the debug sync facility has been
|
||||
# shut down.
|
||||
--let $write_var= SET DEBUG="+d,sleep_after_lock_thread_count_before_delete_thd"; CREATE TEMPORARY TABLE test.t1 (a INT);
|
||||
--let $write_to_file= GENERATE
|
||||
--disable_query_log
|
||||
--source include/write_var_to_file.inc
|
||||
--enable_query_log
|
||||
|
||||
--exec $MYSQL < $write_to_file
|
||||
RESET MASTER;
|
||||
--remove_file $write_to_file
|
13
sql/log.cc
13
sql/log.cc
@ -3372,12 +3372,6 @@ bool MYSQL_BIN_LOG::reset_logs(THD* thd)
|
||||
DBUG_ENTER("reset_logs");
|
||||
|
||||
ha_reset_logs(thd);
|
||||
/*
|
||||
We need to get both locks to be sure that no one is trying to
|
||||
write to the index log file.
|
||||
*/
|
||||
mysql_mutex_lock(&LOCK_log);
|
||||
mysql_mutex_lock(&LOCK_index);
|
||||
|
||||
/*
|
||||
The following mutex is needed to ensure that no threads call
|
||||
@ -3387,6 +3381,13 @@ bool MYSQL_BIN_LOG::reset_logs(THD* thd)
|
||||
*/
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
|
||||
/*
|
||||
We need to get both locks to be sure that no one is trying to
|
||||
write to the index log file.
|
||||
*/
|
||||
mysql_mutex_lock(&LOCK_log);
|
||||
mysql_mutex_lock(&LOCK_index);
|
||||
|
||||
/* Save variables so that we can reopen the log */
|
||||
save_name=name;
|
||||
name=0; // Protect against free
|
||||
|
@ -2070,6 +2070,12 @@ void unlink_thd(THD *thd)
|
||||
thd_cleanup(thd);
|
||||
dec_connection_count();
|
||||
mysql_mutex_lock(&LOCK_thread_count);
|
||||
/*
|
||||
Used by binlog_reset_master. It would be cleaner to use
|
||||
DEBUG_SYNC here, but that's not possible because the THD's debug
|
||||
sync feature has been shut down at this point.
|
||||
*/
|
||||
DBUG_EXECUTE_IF("sleep_after_lock_thread_count_before_delete_thd", sleep(5););
|
||||
delete_thd(thd);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user