Commit 259b9452 authored by Sergei Golubchik's avatar Sergei Golubchik

remove find_thread_with_thd_data_lock_callback

let the caller take the lock if needed
parent eac8341d
...@@ -9098,24 +9098,6 @@ THD *find_thread_by_id(longlong id, bool query_id) ...@@ -9098,24 +9098,6 @@ THD *find_thread_by_id(longlong id, bool query_id)
return arg.thd; return arg.thd;
} }
static my_bool find_thread_with_thd_data_lock_callback(THD *thd, find_thread_callback_arg *arg)
{
if (arg->id == (arg->query_id ? thd->query_id : (longlong) thd->thread_id))
{
mysql_mutex_lock(&thd->LOCK_thd_kill); // Lock from delete
mysql_mutex_lock(&thd->LOCK_thd_data); // XXX DELME
arg->thd= thd;
return 1;
}
return 0;
}
THD *find_thread_by_id_with_thd_data_lock(longlong id, bool query_id)
{
find_thread_callback_arg arg(id, query_id);
server_threads.iterate(find_thread_with_thd_data_lock_callback, &arg);
return arg.thd;
}
/** /**
kill one thread. kill one thread.
...@@ -9132,7 +9114,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ ...@@ -9132,7 +9114,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ
uint error= (type == KILL_TYPE_QUERY ? ER_NO_SUCH_QUERY : ER_NO_SUCH_THREAD); uint error= (type == KILL_TYPE_QUERY ? ER_NO_SUCH_QUERY : ER_NO_SUCH_THREAD);
DBUG_ENTER("kill_one_thread"); DBUG_ENTER("kill_one_thread");
DBUG_PRINT("enter", ("id: %lld signal: %u", id, (uint) kill_signal)); DBUG_PRINT("enter", ("id: %lld signal: %u", id, (uint) kill_signal));
tmp= find_thread_by_id_with_thd_data_lock(id, type == KILL_TYPE_QUERY); tmp= find_thread_by_id(id, type == KILL_TYPE_QUERY);
if (!tmp) if (!tmp)
DBUG_RETURN(error); DBUG_RETURN(error);
...@@ -9159,6 +9141,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ ...@@ -9159,6 +9141,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ
faster and do a harder kill than KILL_SYSTEM_THREAD; faster and do a harder kill than KILL_SYSTEM_THREAD;
*/ */
mysql_mutex_lock(&tmp->LOCK_thd_data); // for various wsrep* checks below
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (((thd->security_ctx->master_access & SUPER_ACL) || if (((thd->security_ctx->master_access & SUPER_ACL) ||
thd->security_ctx->user_matches(tmp->security_ctx)) && thd->security_ctx->user_matches(tmp->security_ctx)) &&
...@@ -9180,8 +9163,8 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ ...@@ -9180,8 +9163,8 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ
else else
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
{ {
WSREP_DEBUG("kill_one_thread %llu, victim: %llu wsrep_aborter %llu by signal %d", WSREP_DEBUG("kill_one_thread %llu, victim: %llu wsrep_aborter %llu by signal %d",
thd->thread_id, id, tmp->wsrep_aborter, kill_signal); thd->thread_id, id, tmp->wsrep_aborter, kill_signal);
tmp->awake_no_mutex(kill_signal); tmp->awake_no_mutex(kill_signal);
WSREP_DEBUG("victim: %llu taken care of", id); WSREP_DEBUG("victim: %llu taken care of", id);
error= 0; error= 0;
...@@ -9190,9 +9173,9 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ ...@@ -9190,9 +9173,9 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ
else else
error= (type == KILL_TYPE_QUERY ? ER_KILL_QUERY_DENIED_ERROR : error= (type == KILL_TYPE_QUERY ? ER_KILL_QUERY_DENIED_ERROR :
ER_KILL_DENIED_ERROR); ER_KILL_DENIED_ERROR);
mysql_mutex_unlock(&tmp->LOCK_thd_data);
} }
mysql_mutex_unlock(&tmp->LOCK_thd_kill); mysql_mutex_unlock(&tmp->LOCK_thd_kill);
mysql_mutex_unlock(&tmp->LOCK_thd_data);
DBUG_PRINT("exit", ("%d", error)); DBUG_PRINT("exit", ("%d", error));
DBUG_RETURN(error); DBUG_RETURN(error);
} }
......
...@@ -144,7 +144,6 @@ const char* get_one_variable(THD *thd, const SHOW_VAR *variable, ...@@ -144,7 +144,6 @@ const char* get_one_variable(THD *thd, const SHOW_VAR *variable,
/* These functions were under INNODB_COMPATIBILITY_HOOKS */ /* These functions were under INNODB_COMPATIBILITY_HOOKS */
int get_quote_char_for_identifier(THD *thd, const char *name, size_t length); int get_quote_char_for_identifier(THD *thd, const char *name, size_t length);
THD *find_thread_by_id(longlong id, bool query_id= false); THD *find_thread_by_id(longlong id, bool query_id= false);
THD *find_thread_by_id_with_thd_data_lock(longlong id, bool query_id= false);
class select_result_explain_buffer; class select_result_explain_buffer;
/* /*
......
...@@ -18583,8 +18583,10 @@ static void bg_wsrep_kill_trx(void *void_arg) ...@@ -18583,8 +18583,10 @@ static void bg_wsrep_kill_trx(void *void_arg)
trx_t *victim_trx; trx_t *victim_trx;
bool aborting= false; bool aborting= false;
bf_thd= find_thread_by_id_with_thd_data_lock(arg->bf_thd_id); if ((bf_thd= find_thread_by_id(arg->bf_thd_id)))
thd= find_thread_by_id_with_thd_data_lock(arg->thd_id); wsrep_thd_LOCK(bf_thd);
if ((thd= find_thread_by_id(arg->thd_id)))
wsrep_thd_LOCK(thd);
if (!thd || !bf_thd || !(victim_trx= thd_to_trx(thd))) if (!thd || !bf_thd || !(victim_trx= thd_to_trx(thd)))
goto ret0; goto ret0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment