summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2017-02-08 15:42:15 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2017-02-08 17:23:13 +0200
commitd831e4c22a0c4e7367f08f0a45c1bae5afca82fd (patch)
tree368fac5581b866dd2d3a40032fcc8f73777ecb96
parentf1627045701b0dc0ff10ec09cca18dc5da351768 (diff)
downloadmariadb-git-d831e4c22a0c4e7367f08f0a45c1bae5afca82fd.tar.gz
MDEV-12024 InnoDB startup fails to wait for recv_writer_thread to finish
recv_writer_thread(): Do not assign recv_writer_thread_active=true in order to avoid a race condition with recv_recovery_from_checkpoint_finish(). recv_init_crash_recovery(): Assign recv_writer_thread_active=true before creating recv_writer_thread.
-rw-r--r--storage/innobase/log/log0recv.cc5
-rw-r--r--storage/xtradb/log/log0recv.cc5
2 files changed, 4 insertions, 6 deletions
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc
index 70913bd49ce..6137c84b21d 100644
--- a/storage/innobase/log/log0recv.cc
+++ b/storage/innobase/log/log0recv.cc
@@ -174,7 +174,7 @@ UNIV_INTERN mysql_pfs_key_t recv_writer_mutex_key;
# endif /* UNIV_PFS_MUTEX */
/** Flag indicating if recv_writer thread is active. */
-UNIV_INTERN bool recv_writer_thread_active = false;
+static volatile bool recv_writer_thread_active;
UNIV_INTERN os_thread_t recv_writer_thread_handle = 0;
#endif /* !UNIV_HOTBACKUP */
@@ -344,8 +344,6 @@ DECLARE_THREAD(recv_writer_thread)(
os_thread_pf(os_thread_get_curr_id()));
#endif /* UNIV_DEBUG_THREAD_CREATION */
- recv_writer_thread_active = true;
-
while (srv_shutdown_state == SRV_SHUTDOWN_NONE) {
os_thread_sleep(100000);
@@ -2988,6 +2986,7 @@ recv_init_crash_recovery(void)
/* Spawn the background thread to flush dirty pages
from the buffer pools. */
+ recv_writer_thread_active = true;
recv_writer_thread_handle = os_thread_create(
recv_writer_thread, 0, 0);
}
diff --git a/storage/xtradb/log/log0recv.cc b/storage/xtradb/log/log0recv.cc
index e355c25318c..01975712d99 100644
--- a/storage/xtradb/log/log0recv.cc
+++ b/storage/xtradb/log/log0recv.cc
@@ -177,7 +177,7 @@ UNIV_INTERN mysql_pfs_key_t recv_writer_mutex_key;
# endif /* UNIV_PFS_MUTEX */
/** Flag indicating if recv_writer thread is active. */
-UNIV_INTERN bool recv_writer_thread_active = false;
+static volatile bool recv_writer_thread_active;
UNIV_INTERN os_thread_t recv_writer_thread_handle = 0;
#endif /* !UNIV_HOTBACKUP */
@@ -343,8 +343,6 @@ DECLARE_THREAD(recv_writer_thread)(
os_thread_pf(os_thread_get_curr_id()));
#endif /* UNIV_DEBUG_THREAD_CREATION */
- recv_writer_thread_active = true;
-
while (srv_shutdown_state == SRV_SHUTDOWN_NONE) {
os_thread_sleep(100000);
@@ -3078,6 +3076,7 @@ recv_init_crash_recovery(void)
/* Spawn the background thread to flush dirty pages
from the buffer pools. */
+ recv_writer_thread_active = true;
recv_writer_thread_handle = os_thread_create(
recv_writer_thread, 0, 0);
}