Commit 7a28f61d authored by unknown's avatar unknown

MBug#643463: Slow XtraDB shutdown: Fix more sleeps delaying shutdown.

This patch removes most remaining delays due to uninteruptible sleep()
during shutdown, as found using PMP. This makes standard test run very
close in speed to with --loose-innodb-fast-shutdown=2, and greatly
speeds up running the test suite.

sql/mysqld.cc:
  Poll for threads to die every 20 msec during shutdown, rather than force
  a wait for 2 full seconds should one thread be a little slow to exit
  (this was seen occasionally in mysql-test-run).
storage/xtradb/include/srv0srv.h:
  Rename the event, as we now use it to wakeup more threads during shutdown.
storage/xtradb/log/log0log.c:
  Rename the event, as we now use it to wakeup more threads during shutdown.
storage/xtradb/srv/srv0srv.c:
  Replace some hardcoded sleep()s with os_wait_event_time() that can be
  interrupted early during server shutdown to avoid unnecessary delays.
parent 7a80bf16
......@@ -1032,8 +1032,9 @@ static void close_connections(void)
Events::deinit();
end_slave();
if (thread_count)
sleep(2); // Give threads time to die
/* Give threads time to die. */
for (int i= 0; thread_count && i < 100; i++)
my_sleep(20000);
/*
Force remaining threads to die by closing the connection to the client
......
......@@ -57,8 +57,8 @@ extern const char srv_mysql50_table_name_prefix[9];
thread starts running */
extern os_event_t srv_lock_timeout_thread_event;
/* This event is set to tell the purge thread to shut down */
extern os_event_t srv_purge_thread_event;
/* This event is set at shutdown to wakeup threads from sleep */
extern os_event_t srv_shutdown_event;
/* If the last data file is auto-extended, we add this many pages to it
at a time */
......
......@@ -3102,7 +3102,7 @@ logs_empty_and_mark_files_at_shutdown(void)
algorithm only works if the server is idle at shutdown */
srv_shutdown_state = SRV_SHUTDOWN_CLEANUP;
os_event_set(srv_purge_thread_event);
os_event_set(srv_shutdown_event);
loop:
os_thread_sleep(100000);
......
......@@ -704,7 +704,7 @@ UNIV_INTERN srv_slot_t* srv_mysql_table = NULL;
UNIV_INTERN os_event_t srv_lock_timeout_thread_event;
UNIV_INTERN os_event_t srv_purge_thread_event;
UNIV_INTERN os_event_t srv_shutdown_event;
UNIV_INTERN srv_sys_t* srv_sys = NULL;
......@@ -1011,7 +1011,7 @@ srv_init(void)
}
srv_lock_timeout_thread_event = os_event_create(NULL);
srv_purge_thread_event = os_event_create(NULL);
srv_shutdown_event = os_event_create(NULL);
for (i = 0; i < SRV_MASTER + 1; i++) {
srv_n_threads_active[i] = 0;
......@@ -2239,7 +2239,7 @@ loop:
/* Wake up every 5 seconds to see if we need to print
monitor information. */
os_thread_sleep(5000000);
os_event_wait_time(srv_shutdown_event, 5000000);
current_time = time(NULL);
......@@ -2381,7 +2381,7 @@ loop:
/* When someone is waiting for a lock, we wake up every second
and check if a timeout has passed for a lock wait */
os_thread_sleep(1000000);
os_event_wait_time(srv_shutdown_event, 1000000);
srv_lock_timeout_active = TRUE;
......@@ -2546,7 +2546,7 @@ loop:
fflush(stderr);
os_thread_sleep(1000000);
os_event_wait_time(srv_shutdown_event, 1000000);
if (srv_shutdown_state < SRV_SHUTDOWN_CLEANUP) {
......@@ -2590,7 +2590,7 @@ srv_LRU_dump_restore_thread(
last_dump_time = time(NULL);
loop:
os_thread_sleep(5000000);
os_event_wait_time(srv_shutdown_event, 5000000);
if (srv_shutdown_state >= SRV_SHUTDOWN_CLEANUP) {
goto exit_func;
......@@ -2754,7 +2754,7 @@ loop:
if (!skip_sleep) {
os_thread_sleep(1000000);
os_event_wait_time(srv_shutdown_event, 1000000);
srv_main_sleeps++;
/*
......@@ -3340,10 +3340,10 @@ loop:
mutex_exit(&kernel_mutex);
sleep_ms = 10;
os_event_reset(srv_purge_thread_event);
os_event_reset(srv_shutdown_event);
}
os_event_wait_time(srv_purge_thread_event, sleep_ms * 1000);
os_event_wait_time(srv_shutdown_event, sleep_ms * 1000);
history_len = trx_sys->rseg_history_len;
if (history_len > 1000)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment