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.
This commit is contained in:
parent
71261e3188
commit
382115b992
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user