summaryrefslogtreecommitdiff
path: root/storage/xtradb/buf/buf0flu.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/xtradb/buf/buf0flu.cc')
-rw-r--r--storage/xtradb/buf/buf0flu.cc16
1 files changed, 14 insertions, 2 deletions
diff --git a/storage/xtradb/buf/buf0flu.cc b/storage/xtradb/buf/buf0flu.cc
index 84eea3bc692..db7e2172e93 100644
--- a/storage/xtradb/buf/buf0flu.cc
+++ b/storage/xtradb/buf/buf0flu.cc
@@ -2861,7 +2861,10 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)(
when SRV_SHUTDOWN_CLEANUP is set other threads like the master
and the purge threads may be working as well. We start flushing
the buffer pool but can't be sure that no new pages are being
- dirtied until we enter SRV_SHUTDOWN_FLUSH_PHASE phase. */
+ dirtied until we enter SRV_SHUTDOWN_FLUSH_PHASE phase. Because
+ the LRU manager thread is also flushing at SRV_SHUTDOWN_CLEANUP
+ but not SRV_SHUTDOWN_FLUSH_PHASE, we only leave the
+ SRV_SHUTDOWN_CLEANUP loop when the LRU manager quits. */
do {
n_flushed = page_cleaner_do_flush_batch(PCT_IO(100), LSN_MAX);
@@ -2870,7 +2873,10 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)(
if (n_flushed == 0) {
os_thread_sleep(100000);
}
- } while (srv_shutdown_state == SRV_SHUTDOWN_CLEANUP);
+
+ os_rmb;
+ } while (srv_shutdown_state == SRV_SHUTDOWN_CLEANUP
+ || buf_lru_manager_is_active);
/* At this point all threads including the master and the purge
thread must have been suspended. */
@@ -2887,6 +2893,11 @@ DECLARE_THREAD(buf_flush_page_cleaner_thread)(
buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST);
buf_flush_wait_LRU_batch_end();
+#ifdef UNIV_DEBUG
+ os_rmb;
+ ut_ad(!buf_lru_manager_is_active);
+#endif
+
bool success;
do {
@@ -2965,6 +2976,7 @@ DECLARE_THREAD(buf_flush_lru_manager_thread)(
}
buf_lru_manager_is_active = false;
+ os_wmb;
/* We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */