diff options
author | unknown <knielsen@knielsen-hq.org> | 2010-11-09 15:03:57 +0100 |
---|---|---|
committer | unknown <knielsen@knielsen-hq.org> | 2010-11-09 15:03:57 +0100 |
commit | 7a28f61ded763f4778b5f595115a0b1fde2372a8 (patch) | |
tree | 6e5c5e7b53df6a4f4893c646a593173201858777 | |
parent | 7a80bf165b1907acbdccf8dd46681df365dd2156 (diff) | |
download | mariadb-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.cc | 5 | ||||
-rw-r--r-- | storage/xtradb/include/srv0srv.h | 4 | ||||
-rw-r--r-- | storage/xtradb/log/log0log.c | 2 | ||||
-rw-r--r-- | storage/xtradb/srv/srv0srv.c | 18 |
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) |