diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2017-12-01 15:02:04 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2017-12-01 15:02:04 +0200 |
commit | 8d24bef640565c149e9b8428e3a6738a88e3d6dc (patch) | |
tree | 02b4b6eefbed8f68f6730f3038628a6121a5d6d6 | |
parent | f59a1826f81e3246735c2ca61daec794170b61d1 (diff) | |
download | mariadb-git-8d24bef640565c149e9b8428e3a6738a88e3d6dc.tar.gz |
MDEV-14080 InnoDB shutdown sometimes hangs
srv_purge_wakeup(): If thd_destructor_proxy has initiated the first
step of shutdown, ensure that all purge threads terminate.
logs_empty_and_mark_files_at_shutdown(): Add a debug assertion.
(The purge threads should have been shut down already before this step.)
-rw-r--r-- | storage/innobase/log/log0log.cc | 1 | ||||
-rw-r--r-- | storage/innobase/srv/srv0srv.cc | 9 |
2 files changed, 8 insertions, 2 deletions
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index f7974d243d8..01f3ff1034c 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -1979,6 +1979,7 @@ wait_suspend_loop: goto wait_suspend_loop; case SRV_PURGE: case SRV_WORKER: + ut_ad(!"purge was not shut down"); srv_purge_wakeup(); thread_name = "purge thread"; goto wait_suspend_loop; diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 25ec0670c7d..9ac4daf5901 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -2980,8 +2980,11 @@ srv_purge_wakeup() { ut_ad(!srv_read_only_mode); - if (srv_force_recovery < SRV_FORCE_NO_BACKGROUND) { + if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND) { + return; + } + do { srv_release_threads(SRV_PURGE, 1); if (srv_n_purge_threads > 1) { @@ -2989,7 +2992,9 @@ srv_purge_wakeup() srv_release_threads(SRV_WORKER, n_workers); } - } + } while (!srv_running + && (srv_sys.n_threads_active[SRV_WORKER] + || srv_sys.n_threads_active[SRV_PURGE])); } /** Check if tablespace is being truncated. |