mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Move all kill mutex protection to LOCK_thd_kill
LOCK_thd_data was used to protect both THD data and ensure that the THD is not deleted while it was in use This patch moves the THD delete protection to LOCK_thd_kill, which already protects the THD for kill. The benefits are: - More well defined what LOCK_thd_data protects - LOCK_thd_data usage is now much simpler and easier to verify - Less chance of deadlocks in SHOW PROCESS LIST as there is less chance of interactions between mutexes - Remove not needed LOCK_thread_count from thd_get_error_context_description() - Fewer mutex taken for thd->awake() Other things: - Don't take mysys->var mutex in show processlist to check if thread is kill marked - thd->awake() now automatically takes the LOCK_thd_kill mutex (Simplifies code) - Apc uses LOCK_thd_kill instead of LOCK_thd_data
This commit is contained in:
@ -2702,9 +2702,9 @@ void kill_delayed_threads(void)
|
||||
Delayed_insert *di;
|
||||
while ((di= it++))
|
||||
{
|
||||
mysql_mutex_lock(&di->thd.LOCK_thd_data);
|
||||
mysql_mutex_lock(&di->thd.LOCK_thd_kill);
|
||||
if (di->thd.killed < KILL_CONNECTION)
|
||||
di->thd.set_killed(KILL_CONNECTION);
|
||||
di->thd.set_killed_no_mutex(KILL_CONNECTION);
|
||||
if (di->thd.mysys_var)
|
||||
{
|
||||
mysql_mutex_lock(&di->thd.mysys_var->mutex);
|
||||
@ -2722,7 +2722,7 @@ void kill_delayed_threads(void)
|
||||
}
|
||||
mysql_mutex_unlock(&di->thd.mysys_var->mutex);
|
||||
}
|
||||
mysql_mutex_unlock(&di->thd.LOCK_thd_data);
|
||||
mysql_mutex_unlock(&di->thd.LOCK_thd_kill);
|
||||
}
|
||||
mysql_mutex_unlock(&LOCK_delayed_insert); // For unlink from list
|
||||
DBUG_VOID_RETURN;
|
||||
@ -3076,9 +3076,9 @@ pthread_handler_t handle_delayed_insert(void *arg)
|
||||
this.
|
||||
*/
|
||||
mysql_mutex_lock(&thd->LOCK_thd_data);
|
||||
thd->set_killed(KILL_CONNECTION_HARD); // If error
|
||||
thd->mdl_context.set_needs_thr_lock_abort(0);
|
||||
mysql_mutex_unlock(&thd->LOCK_thd_data);
|
||||
thd->set_killed(KILL_CONNECTION_HARD); // If error
|
||||
|
||||
close_thread_tables(thd); // Free the table
|
||||
thd->mdl_context.release_transactional_locks();
|
||||
|
Reference in New Issue
Block a user