mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
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:
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");
|
DBUG_ENTER("reset_logs");
|
||||||
|
|
||||||
ha_reset_logs(thd);
|
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
|
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);
|
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 variables so that we can reopen the log */
|
||||||
save_name=name;
|
save_name=name;
|
||||||
name=0; // Protect against free
|
name=0; // Protect against free
|
||||||
|
@ -2070,6 +2070,12 @@ void unlink_thd(THD *thd)
|
|||||||
thd_cleanup(thd);
|
thd_cleanup(thd);
|
||||||
dec_connection_count();
|
dec_connection_count();
|
||||||
mysql_mutex_lock(&LOCK_thread_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);
|
delete_thd(thd);
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user