summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2017-12-01 15:02:04 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2017-12-01 15:02:04 +0200
commit8d24bef640565c149e9b8428e3a6738a88e3d6dc (patch)
tree02b4b6eefbed8f68f6730f3038628a6121a5d6d6
parentf59a1826f81e3246735c2ca61daec794170b61d1 (diff)
downloadmariadb-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.cc1
-rw-r--r--storage/innobase/srv/srv0srv.cc9
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.