MDEV-13779 InnoDB fails to shut down purge workers, causing hang
srv_purge_coordinator_thread(): Wait for all purge worker threads to actually exit. An analysis of a core dump of a hung 10.3 server revealed that one srv_worker_thread did not exit, even though the purge coordinator had exited. This caused kill_server_thread and mysqld_main to wait indefinitely. The main InnoDB shutdown was never called, because unireg_end() was never called.
This commit is contained in:
parent
ebc24950e6
commit
a4e7800701
@ -2876,8 +2876,18 @@ DECLARE_THREAD(srv_purge_coordinator_thread)(
|
||||
#endif /* UNIV_DEBUG_THREAD_CREATION */
|
||||
|
||||
/* Ensure that all the worker threads quit. */
|
||||
if (srv_n_purge_threads > 1) {
|
||||
srv_release_threads(SRV_WORKER, srv_n_purge_threads - 1);
|
||||
if (ulint n_workers = srv_n_purge_threads - 1) {
|
||||
const srv_slot_t* slot;
|
||||
const srv_slot_t* const end = &srv_sys.sys_threads[
|
||||
srv_sys.n_sys_threads];
|
||||
|
||||
do {
|
||||
srv_release_threads(SRV_WORKER, n_workers);
|
||||
srv_sys_mutex_enter();
|
||||
for (slot = &srv_sys.sys_threads[2];
|
||||
!slot++->in_use && slot < end; );
|
||||
srv_sys_mutex_exit();
|
||||
} while (slot < end);
|
||||
}
|
||||
|
||||
innobase_destroy_background_thd(thd);
|
||||
|
Loading…
x
Reference in New Issue
Block a user