diff options
author | Jan Lindström <jplindst@mariadb.org> | 2014-07-24 14:35:09 +0300 |
---|---|---|
committer | Jan Lindström <jplindst@mariadb.org> | 2014-07-24 14:35:09 +0300 |
commit | 7bf45bec5436cf1c61fa08f007eb4bb26aac1cf7 (patch) | |
tree | 300b986b3a96d5cc796d6d3d6d84da655ee67b06 | |
parent | 06655a192d7d3216fccc18c1f25601c4ecff09d4 (diff) | |
download | mariadb-git-7bf45bec5436cf1c61fa08f007eb4bb26aac1cf7.tar.gz |
Fix too agressive long semaphore wait output and add guard against introducing
compression failures on insert buffer.
-rw-r--r-- | mysql-test/include/mtr_warnings.sql | 1 | ||||
-rw-r--r-- | storage/innobase/page/page0zip.c | 1 | ||||
-rw-r--r-- | storage/innobase/sync/sync0arr.c | 61 | ||||
-rw-r--r-- | storage/xtradb/page/page0zip.c | 1 | ||||
-rw-r--r-- | storage/xtradb/sync/sync0arr.c | 61 |
5 files changed, 83 insertions, 42 deletions
diff --git a/mysql-test/include/mtr_warnings.sql b/mysql-test/include/mtr_warnings.sql index 37a17a8133e..f24edcfb996 100644 --- a/mysql-test/include/mtr_warnings.sql +++ b/mysql-test/include/mtr_warnings.sql @@ -159,6 +159,7 @@ INSERT INTO global_suppressions VALUES ("InnoDB: Error: in ALTER TABLE `test`.`t[123]`"), ("InnoDB: Error: in RENAME TABLE table `test`.`t1`"), ("InnoDB: Error: table `test`.`t[123]` .*does not exist in the InnoDB internal"), + ("InnoDB: Warning: semaphore wait:"), /* BUG#32080 - Excessive warnings on Solaris: setrlimit could not diff --git a/storage/innobase/page/page0zip.c b/storage/innobase/page/page0zip.c index 3d651f548fd..af209a1d8a9 100644 --- a/storage/innobase/page/page0zip.c +++ b/storage/innobase/page/page0zip.c @@ -1272,6 +1272,7 @@ page_zip_compress( records. */ if (srv_simulate_comp_failures + && !dict_index_is_ibuf(index) && page_get_n_recs(page) >= 2 && ((ulint)(rand() % 100) < srv_simulate_comp_failures)) { diff --git a/storage/innobase/sync/sync0arr.c b/storage/innobase/sync/sync0arr.c index 51461c00db0..ea4d496e6b5 100644 --- a/storage/innobase/sync/sync0arr.c +++ b/storage/innobase/sync/sync0arr.c @@ -971,27 +971,6 @@ sync_array_print_long_waits( stderr); sync_array_cell_print(stderr, cell, &reserver); noticed = TRUE; - } else { - fputs("InnoDB: Warning: semaphore wait:\n", - stderr); - sync_array_cell_print(stderr, cell, &reserver); - } - - /* Try to output cell information for writer recursive way */ - while (reserver != 0) { - sync_cell_t* reserver_wait; - - reserver_wait = sync_array_find_thread(sync_primary_wait_array, reserver); - - if (reserver_wait && - reserver_wait->wait_object != NULL && - reserver_wait->waiting) { - fputs("InnoDB: Warning: Writer thread is waiting this semaphore:\n", - stderr); - sync_array_cell_print(stderr, reserver_wait, &reserver); - } else { - reserver = 0; - } } if (diff > fatal_timeout) { @@ -1005,6 +984,46 @@ sync_array_print_long_waits( } } + /* We found a long semaphore wait, wait all threads that are + waiting for a semaphore. */ + if (noticed) { + for (i = 0; i < sync_primary_wait_array->n_cells; i++) { + void* wait_object; + os_thread_id_t reserver=0; + + cell = sync_array_get_nth_cell(sync_primary_wait_array, i); + + wait_object = cell->wait_object; + + if (wait_object == NULL || !cell->waiting) { + + continue; + } + + fputs("InnoDB: Warning: semaphore wait:\n", + stderr); + sync_array_cell_print(stderr, cell, &reserver); + noticed = TRUE; + + /* Try to output cell information for writer recursive way */ + while (reserver != 0) { + sync_cell_t* reserver_wait; + + reserver_wait = sync_array_find_thread(sync_primary_wait_array, reserver); + + if (reserver_wait && + reserver_wait->wait_object != NULL && + reserver_wait->waiting) { + fputs("InnoDB: Warning: Writer thread is waiting this semaphore:\n", + stderr); + sync_array_cell_print(stderr, reserver_wait, &reserver); + } else { + reserver = 0; + } + } + } + } + sync_array_exit(sync_primary_wait_array); if (noticed) { diff --git a/storage/xtradb/page/page0zip.c b/storage/xtradb/page/page0zip.c index a4ebb250d95..ca517139a45 100644 --- a/storage/xtradb/page/page0zip.c +++ b/storage/xtradb/page/page0zip.c @@ -1276,6 +1276,7 @@ page_zip_compress( records. */ if (srv_simulate_comp_failures + && !dict_index_is_ibuf(index) && page_get_n_recs(page) >= 2 && ((ulint)(rand() % 100) < srv_simulate_comp_failures)) { diff --git a/storage/xtradb/sync/sync0arr.c b/storage/xtradb/sync/sync0arr.c index fc57a81e95a..90208f6314f 100644 --- a/storage/xtradb/sync/sync0arr.c +++ b/storage/xtradb/sync/sync0arr.c @@ -995,27 +995,6 @@ sync_array_print_long_waits( stderr); sync_array_cell_print(stderr, cell, &reserver); noticed = TRUE; - } else { - fputs("InnoDB: Warning: semaphore wait:\n", - stderr); - sync_array_cell_print(stderr, cell, &reserver); - } - - /* Try to output cell information for writer recursive way */ - while (reserver != 0) { - sync_cell_t* reserver_wait; - - reserver_wait = sync_array_find_thread(sync_primary_wait_array, reserver); - - if (reserver_wait && - reserver_wait->wait_object != NULL && - reserver_wait->waiting) { - fputs("InnoDB: Warning: Writer thread is waiting this semaphore:\n", - stderr); - sync_array_cell_print(stderr, reserver_wait, &reserver); - } else { - reserver = 0; - } } if (diff > fatal_timeout) { @@ -1029,6 +1008,46 @@ sync_array_print_long_waits( } } + /* We found a long semaphore wait, wait all threads that are + waiting for a semaphore. */ + if (noticed) { + for (i = 0; i < sync_primary_wait_array->n_cells; i++) { + void* wait_object; + os_thread_id_t reserver=0; + + cell = sync_array_get_nth_cell(sync_primary_wait_array, i); + + wait_object = cell->wait_object; + + if (wait_object == NULL || !cell->waiting) { + + continue; + } + + fputs("InnoDB: Warning: semaphore wait:\n", + stderr); + sync_array_cell_print(stderr, cell, &reserver); + noticed = TRUE; + + /* Try to output cell information for writer recursive way */ + while (reserver != 0) { + sync_cell_t* reserver_wait; + + reserver_wait = sync_array_find_thread(sync_primary_wait_array, reserver); + + if (reserver_wait && + reserver_wait->wait_object != NULL && + reserver_wait->waiting) { + fputs("InnoDB: Warning: Writer thread is waiting this semaphore:\n", + stderr); + sync_array_cell_print(stderr, reserver_wait, &reserver); + } else { + reserver = 0; + } + } + } + } + sync_array_exit(sync_primary_wait_array); if (noticed) { |