From e38a05e20a5b7c3d0ac0ddb6975e2af9b103c799 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Thu, 2 Sep 2021 19:41:54 +0200 Subject: [PATCH] Fix create_background_thd() Allow the caller to have current_thd. Also do not store PSI_CALL_get_thread() in the new THD, it is a thread local storage variable that can become invalid any time, we do not control the lifetime of the caller's thread. --- sql/sql_class.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index df241afc838..0d9a8439ccb 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -4894,11 +4894,13 @@ void destroy_thd(MYSQL_THD thd) extern "C" pthread_key(struct st_my_thread_var *, THR_KEY_mysys); MYSQL_THD create_background_thd() { - DBUG_ASSERT(!current_thd); + auto save_thd = current_thd; + set_current_thd(nullptr); + auto save_mysysvar= pthread_getspecific(THR_KEY_mysys); /* - Allocate new mysys_var specifically this THD, + Allocate new mysys_var specifically new THD, so that e.g safemalloc, DBUG etc are happy. */ pthread_setspecific(THR_KEY_mysys, 0); @@ -4906,7 +4908,8 @@ MYSQL_THD create_background_thd() auto thd_mysysvar= pthread_getspecific(THR_KEY_mysys); auto thd= new THD(0); pthread_setspecific(THR_KEY_mysys, save_mysysvar); - thd->set_psi(PSI_CALL_get_thread()); + thd->set_psi(nullptr); + set_current_thd(save_thd); /* Workaround the adverse effect of incrementing thread_count