From 382115b99297ceaa4c3067f79efb5c2515013be5 Mon Sep 17 00:00:00 2001 From: Sergey Vojtovich Date: Mon, 21 Jan 2019 19:10:38 +0400 Subject: [PATCH] MDEV-12747 - main.mysqld_option_err fails in buildbot with timeout thd_destructor_proxy() may miss abort signal if innobase_end() is running concurrently, which causes server hang in pthread_join() on shutdown. The problem was that aborting wasn't protected by mutex: proxy thr: while (!myvar->abort) end thr: running->abort = 1; end thr: mysql_cond_broadcast(...); proxy thr: mysql_cond_wait(...); // nobody to awake it end thr: pthread_join(...); // waits for proxy thr Also made main.mysqld_option_err reentrant. --- mysql-test/main/mysqld_option_err.test | 2 ++ storage/innobase/handler/ha_innodb.cc | 18 +++++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/mysql-test/main/mysqld_option_err.test b/mysql-test/main/mysqld_option_err.test index 0c38eba7ca9..e9655fd4bfe 100644 --- a/mysql-test/main/mysqld_option_err.test +++ b/mysql-test/main/mysqld_option_err.test @@ -56,4 +56,6 @@ mkdir $MYSQLTEST_VARDIR/tmp/mysqld_option_err; --error 2 --exec $MYSQLD_BOOTSTRAP_CMD --not-known-option --help --verbose >>$MYSQLTEST_VARDIR/tmp/mysqld_option_err/mysqltest.log 2>&1 +rmdir $MYSQLTEST_VARDIR/tmp/mysqld_option_err; + --echo Done. diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 35c8b7fb1c5..2690ff9f736 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -4339,15 +4339,15 @@ innobase_end(handlerton*, ha_panic_function) } } - st_my_thread_var* running = - srv_running.load(std::memory_order_relaxed); - if (!abort_loop && running) { - // may be UNINSTALL PLUGIN statement - running->abort = 1; - mysql_cond_broadcast(running->current_cond); - } - - if (!srv_read_only_mode) { + if (auto r = srv_running.load(std::memory_order_relaxed)) { + ut_ad(!srv_read_only_mode); + if (!abort_loop) { + // may be UNINSTALL PLUGIN statement + mysql_mutex_lock(r->current_mutex); + r->abort = 1; + mysql_cond_broadcast(r->current_cond); + mysql_mutex_unlock(r->current_mutex); + } pthread_join(thd_destructor_thread, NULL); }