summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <knielsen@knielsen-hq.org>2010-11-09 15:03:57 +0100
committerunknown <knielsen@knielsen-hq.org>2010-11-09 15:03:57 +0100
commit7a28f61ded763f4778b5f595115a0b1fde2372a8 (patch)
tree6e5c5e7b53df6a4f4893c646a593173201858777
parent7a80bf165b1907acbdccf8dd46681df365dd2156 (diff)
downloadmariadb-git-7a28f61ded763f4778b5f595115a0b1fde2372a8.tar.gz
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.
-rw-r--r--sql/mysqld.cc5
-rw-r--r--storage/xtradb/include/srv0srv.h4
-rw-r--r--storage/xtradb/log/log0log.c2
-rw-r--r--storage/xtradb/srv/srv0srv.c18
4 files changed, 15 insertions, 14 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index c2670308b8a..ebdf9dd7b38 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -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
diff --git a/storage/xtradb/include/srv0srv.h b/storage/xtradb/include/srv0srv.h
index 8c64d5cee71..f4c9704741c 100644
--- a/storage/xtradb/include/srv0srv.h
+++ b/storage/xtradb/include/srv0srv.h
@@ -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 */
diff --git a/storage/xtradb/log/log0log.c b/storage/xtradb/log/log0log.c
index b9f19aeff31..3f14d84ac72 100644
--- a/storage/xtradb/log/log0log.c
+++ b/storage/xtradb/log/log0log.c
@@ -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);
diff --git a/storage/xtradb/srv/srv0srv.c b/storage/xtradb/srv/srv0srv.c
index 43799aab196..35745072445 100644
--- a/storage/xtradb/srv/srv0srv.c
+++ b/storage/xtradb/srv/srv0srv.c
@@ -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)