Hi Codership, Can you do a review of this patch for InnoDB (XtraDB)? It is https://bugs.launchpad.net/percona-server/+bug/643463, it fixes a problem that a number of threads in the InnoDB code used sleep() for several seconds, which unnecessarily delays shutdown (this is especially annoying when doing testing, eg. the test suite). - Kristian. knielsen@knielsen-hq.org writes:
At http://bazaar.launchpad.net/~maria-captains/maria/5.1
------------------------------------------------------------ revno: 2971 revision-id: knielsen@knielsen-hq.org-20101109140357-2obql1onnmjg6to9 parent: monty@askmonty.org-20101107122529-sl5sup1m9gjxlzte committer: knielsen@knielsen-hq.org branch nick: mariadb-5.1 timestamp: Tue 2010-11-09 15:03:57 +0100 message: 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. === modified file 'storage/xtradb/include/srv0srv.h' --- a/storage/xtradb/include/srv0srv.h 2010-11-03 21:40:53 +0000 +++ b/storage/xtradb/include/srv0srv.h 2010-11-09 14:03:57 +0000 @@ -57,8 +57,8 @@ extern const char srv_mysql50_table_name 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 */
=== modified file 'storage/xtradb/log/log0log.c' --- a/storage/xtradb/log/log0log.c 2010-11-03 21:40:53 +0000 +++ b/storage/xtradb/log/log0log.c 2010-11-09 14:03:57 +0000 @@ -3102,7 +3102,7 @@ logs_empty_and_mark_files_at_shutdown(vo 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);
=== modified file 'storage/xtradb/srv/srv0srv.c' --- a/storage/xtradb/srv/srv0srv.c 2010-11-03 21:40:53 +0000 +++ b/storage/xtradb/srv/srv0srv.c 2010-11-09 14:03:57 +0000 @@ -704,7 +704,7 @@ UNIV_INTERN srv_slot_t* srv_mysql_table
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)
_______________________________________________ commits mailing list commits@mariadb.org https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits