summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lindström <jplindst@mariadb.org>2014-07-24 14:35:09 +0300
committerJan Lindström <jplindst@mariadb.org>2014-07-24 14:35:09 +0300
commit7bf45bec5436cf1c61fa08f007eb4bb26aac1cf7 (patch)
tree300b986b3a96d5cc796d6d3d6d84da655ee67b06
parent06655a192d7d3216fccc18c1f25601c4ecff09d4 (diff)
downloadmariadb-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.sql1
-rw-r--r--storage/innobase/page/page0zip.c1
-rw-r--r--storage/innobase/sync/sync0arr.c61
-rw-r--r--storage/xtradb/page/page0zip.c1
-rw-r--r--storage/xtradb/sync/sync0arr.c61
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) {