Skip to content

Commit

Permalink
MDEV-12024 InnoDB startup fails to wait for recv_writer_thread to finish
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
dr-m committed Feb 8, 2017
1 parent f162704 commit d831e4c
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 6 deletions.
5 changes: 2 additions & 3 deletions storage/innobase/log/log0recv.cc
Expand Up @@ -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 */

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down
5 changes: 2 additions & 3 deletions storage/xtradb/log/log0recv.cc
Expand Up @@ -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 */

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit d831e4c

Please sign in to comment.