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.
This commit is contained in:
unknown 2010-11-09 15:03:57 +01:00
parent 7a80bf165b
commit 7a28f61ded
4 changed files with 15 additions and 14 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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);

View File

@ -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)