diff --git a/mysql-test/suite/galera/r/galera_kill_applier.result b/mysql-test/suite/galera/r/galera_kill_applier.result index 65b6096db2e..c0538212a5f 100644 --- a/mysql-test/suite/galera/r/galera_kill_applier.result +++ b/mysql-test/suite/galera/r/galera_kill_applier.result @@ -6,13 +6,13 @@ SELECT @@wsrep_slave_threads; 1 SET GLOBAL wsrep_slave_threads=2; KILL ID; -ERROR HY000: This is a high-priority thread/query and cannot be killed without compromising the consistency of the cluster +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster KILL QUERY ID; -ERROR HY000: This is a high-priority thread/query and cannot be killed without compromising the consistency of the cluster +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster KILL ID; -ERROR HY000: This is a high-priority thread/query and cannot be killed without compromising the consistency of the cluster +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster KILL QUERY ID; -ERROR HY000: This is a high-priority thread/query and cannot be killed without compromising the consistency of the cluster +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster SET GLOBAL wsrep_slave_threads=DEFAULT; connection node_1; create table t1(a int not null primary key) engine=innodb; diff --git a/mysql-test/suite/galera/r/galera_kill_bf.result b/mysql-test/suite/galera/r/galera_kill_bf.result index c5b76560933..783ce7e09e4 100644 --- a/mysql-test/suite/galera/r/galera_kill_bf.result +++ b/mysql-test/suite/galera/r/galera_kill_bf.result @@ -10,9 +10,9 @@ connection node_1; SET SESSION wsrep_sync_wait = 0; SET DEBUG_SYNC = 'now WAIT_FOR bf_started'; KILL ID; -ERROR HY000: This is a high-priority thread/query and cannot be killed without compromising the consistency of the cluster +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster KILL QUERY ID; -ERROR HY000: This is a high-priority thread/query and cannot be killed without compromising the consistency of the cluster +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster connection node_1; SET DEBUG_SYNC = 'now SIGNAL bf_continue'; connection con1; diff --git a/mysql-test/suite/galera/t/galera_kill_applier.test b/mysql-test/suite/galera/t/galera_kill_applier.test index eb05551b334..90c553a0591 100644 --- a/mysql-test/suite/galera/t/galera_kill_applier.test +++ b/mysql-test/suite/galera/t/galera_kill_applier.test @@ -17,21 +17,21 @@ SET GLOBAL wsrep_slave_threads=2; --let $applier_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle' LIMIT 1` --replace_result $applier_thread ID ---error ER_KILL_DENIED_HIGH_PRIORITY +--error ER_KILL_DENIED_ERROR --eval KILL $applier_thread --replace_result $applier_thread ID ---error ER_KILL_DENIED_HIGH_PRIORITY +--error ER_KILL_DENIED_ERROR --eval KILL QUERY $applier_thread --let $aborter_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep aborter idle' LIMIT 1` --replace_result $aborter_thread ID ---error ER_KILL_DENIED_HIGH_PRIORITY +--error ER_KILL_DENIED_ERROR --eval KILL $aborter_thread --replace_result $aborter_thread ID ---error ER_KILL_DENIED_HIGH_PRIORITY +--error ER_KILL_DENIED_ERROR --eval KILL QUERY $aborter_thread SET GLOBAL wsrep_slave_threads=DEFAULT; diff --git a/mysql-test/suite/galera/t/galera_kill_bf.test b/mysql-test/suite/galera/t/galera_kill_bf.test index 7a5d2ef512a..ba588ab659d 100644 --- a/mysql-test/suite/galera/t/galera_kill_bf.test +++ b/mysql-test/suite/galera/t/galera_kill_bf.test @@ -21,11 +21,11 @@ SET DEBUG_SYNC = 'now WAIT_FOR bf_started'; --let $applier_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'debug sync point:%' LIMIT 1` --replace_result $applier_thread ID ---error ER_KILL_DENIED_HIGH_PRIORITY +--error ER_KILL_DENIED_ERROR --eval KILL $applier_thread --replace_result $applier_thread ID ---error ER_KILL_DENIED_HIGH_PRIORITY +--error ER_KILL_DENIED_ERROR --eval KILL QUERY $applier_thread --connection node_1 diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 9c9b9ea734f..13642a62c73 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -9111,5 +9111,3 @@ ER_NOT_ALLOWED_IN_THIS_CONTEXT eng "'%-.128s' is not allowed in this context" ER_DATA_WAS_COMMITED_UNDER_ROLLBACK eng "Engine %s does not support rollback. Changes were committed during rollback call" -ER_KILL_DENIED_HIGH_PRIORITY - eng "This is a high-priority thread/query and cannot be killed without compromising the consistency of the cluster" diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 30646f494ff..f3b7cb75c81 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -9379,8 +9379,12 @@ THD *find_thread_by_id(longlong id, bool query_id) @param type Type of id: thread id or query id */ -uint -kill_one_thread(THD *thd, my_thread_id id, killed_state kill_signal, killed_type type) +static uint +kill_one_thread(THD *thd, my_thread_id id, killed_state kill_signal, killed_type type +#ifdef WITH_WSREP + , bool &wsrep_high_priority +#endif +) { THD *tmp; uint error= (type == KILL_TYPE_QUERY ? ER_NO_SUCH_QUERY : ER_NO_SUCH_THREAD); @@ -9421,9 +9425,10 @@ kill_one_thread(THD *thd, my_thread_id id, killed_state kill_signal, killed_type #ifdef WITH_WSREP if (wsrep_thd_is_BF(tmp, false) || tmp->wsrep_applier) { - error= ER_KILL_DENIED_HIGH_PRIORITY; + error= ER_KILL_DENIED_ERROR; + wsrep_high_priority= true; push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, - ER_KILL_DENIED_HIGH_PRIORITY, + ER_KILL_DENIED_ERROR, "Thread %lld is %s and cannot be killed", tmp->thread_id, (tmp->wsrep_applier ? "wsrep applier" : "high priority")); @@ -9562,14 +9567,28 @@ static uint kill_threads_for_user(THD *thd, LEX_USER *user, static void sql_kill(THD *thd, my_thread_id id, killed_state state, killed_type type) { - uint error; - if (likely(!(error= kill_one_thread(thd, id, state, type)))) +#ifdef WITH_WSREP + bool wsrep_high_priority= false; +#endif + uint error= kill_one_thread(thd, id, state, type +#ifdef WITH_WSREP + , wsrep_high_priority +#endif + ); + + if (likely(!error)) { if (!thd->killed) my_ok(thd); else thd->send_kill_message(); } +#ifdef WITH_WSREP + else if (wsrep_high_priority) + my_printf_error(error, "This is a high priority thread/query and" + " cannot be killed without compromising" + " the consistency of the cluster", MYF(0)); +#endif else { my_error(error, MYF(0), id);