summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Docs/manual.texi3
-rw-r--r--innobase/btr/btr0cur.c25
-rw-r--r--innobase/os/os0file.c2
-rw-r--r--innobase/os/os0sync.c6
-rw-r--r--innobase/srv/srv0srv.c13
-rw-r--r--innobase/sync/sync0arr.c2
-rw-r--r--innobase/trx/trx0undo.c7
-rw-r--r--sql/ha_innodb.cc9
-rw-r--r--sql/ha_innodb.h1
-rw-r--r--sql/mysqld.cc4
10 files changed, 62 insertions, 10 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi
index b03e86e873c..64921945836 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -51289,6 +51289,9 @@ Linux-x86 binaries.
@itemize @bullet
@item
+Fixed buffer overflow problem if someone specified a too long datadir
+parameter to mysqld
+@item
Add missing @code{<row>} tags for @code{mysqldump} XML output.
@item
Fixed problem with @code{crash-me} and @code{gcc} 3.0.4.
diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c
index 25a7060883c..e35ff2ca69e 100644
--- a/innobase/btr/btr0cur.c
+++ b/innobase/btr/btr0cur.c
@@ -302,6 +302,9 @@ btr_cur_search_to_nth_level(
rw_lock_s_unlock(&btr_search_latch);
}
+ /* Store the position of the tree latch we push to mtr so that we
+ know how to release it when we have latched leaf node(s) */
+
savepoint = mtr_set_savepoint(mtr);
tree = index->tree;
@@ -506,12 +509,18 @@ btr_cur_open_at_index_side(
ulint root_height = 0; /* remove warning */
rec_t* node_ptr;
ulint estimate;
+ ulint savepoint;
estimate = latch_mode & BTR_ESTIMATE;
latch_mode = latch_mode & ~BTR_ESTIMATE;
tree = index->tree;
+ /* Store the position of the tree latch we push to mtr so that we
+ know how to release it when we have latched the leaf node */
+
+ savepoint = mtr_set_savepoint(mtr);
+
if (latch_mode == BTR_MODIFY_TREE) {
mtr_x_lock(dict_tree_get_lock(tree), mtr);
} else {
@@ -544,6 +553,22 @@ btr_cur_open_at_index_side(
if (height == 0) {
btr_cur_latch_leaves(tree, page, space, page_no,
latch_mode, cursor, mtr);
+
+ /* In versions <= 3.23.52 we had forgotten to
+ release the tree latch here. If in an index scan
+ we had to scan far to find a record visible to the
+ current transaction, that could starve others
+ waiting for the tree latch. */
+
+ if ((latch_mode != BTR_MODIFY_TREE)
+ && (latch_mode != BTR_CONT_MODIFY_TREE)) {
+
+ /* Release the tree s-latch */
+
+ mtr_release_s_latch_at_savepoint(
+ mtr, savepoint,
+ dict_tree_get_lock(tree));
+ }
}
if (from_left) {
diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c
index 0297388c413..6f122f38107 100644
--- a/innobase/os/os0file.c
+++ b/innobase/os/os0file.c
@@ -2278,7 +2278,7 @@ consecutive_loop:
ut_print_timestamp(stderr);
fprintf(stderr,
" InnoDB: ERROR: The page to be written seems corrupt!\n");
- page_print(combined_buf + len2);
+ buf_page_print(combined_buf + len2);
fprintf(stderr,
"InnoDB: ERROR: The page to be written seems corrupt!\n");
}
diff --git a/innobase/os/os0sync.c b/innobase/os/os0sync.c
index c1345de0d55..14677ede20f 100644
--- a/innobase/os/os0sync.c
+++ b/innobase/os/os0sync.c
@@ -49,6 +49,12 @@ os_event_create(
TRUE, /* Manual reset */
FALSE, /* Initial state nonsignaled */
name);
+ if (!event) {
+ fprintf(stderr,
+"InnoDB: Could not create a Windows event semaphore; Windows error %lu\n",
+ (ulint)GetLastError());
+ }
+
ut_a(event);
return(event);
diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c
index d0ac011e60f..95bcd2351cd 100644
--- a/innobase/srv/srv0srv.c
+++ b/innobase/srv/srv0srv.c
@@ -2825,7 +2825,11 @@ background_loop:
srv_main_thread_op_info = (char*)"purging";
- n_pages_purged = trx_purge();
+ if (srv_fast_shutdown && srv_shutdown_state > 0) {
+ n_pages_purged = 0;
+ } else {
+ n_pages_purged = trx_purge();
+ }
srv_main_thread_op_info = (char*)"reserving kernel mutex";
@@ -2837,7 +2841,12 @@ background_loop:
mutex_exit(&kernel_mutex);
srv_main_thread_op_info = (char*)"doing insert buffer merge";
- n_bytes_merged = ibuf_contract_for_n_pages(TRUE, 20);
+
+ if (srv_fast_shutdown && srv_shutdown_state > 0) {
+ n_bytes_merged = 0;
+ } else {
+ n_bytes_merged = ibuf_contract_for_n_pages(TRUE, 20);
+ }
srv_main_thread_op_info = (char*)"reserving kernel mutex";
diff --git a/innobase/sync/sync0arr.c b/innobase/sync/sync0arr.c
index 4d14c32b1ae..4854b40409e 100644
--- a/innobase/sync/sync0arr.c
+++ b/innobase/sync/sync0arr.c
@@ -924,7 +924,7 @@ sync_array_print_long_waits(void)
}
if (cell->wait_object != NULL
- && difftime(time(NULL), cell->reservation_time) > 420) {
+ && difftime(time(NULL), cell->reservation_time) > 600) {
fprintf(stderr,
"InnoDB: Error: semaphore wait has lasted > 600 seconds\n"
diff --git a/innobase/trx/trx0undo.c b/innobase/trx/trx0undo.c
index 6303c5bbcdd..34f56dba130 100644
--- a/innobase/trx/trx0undo.c
+++ b/innobase/trx/trx0undo.c
@@ -401,6 +401,10 @@ trx_undo_seg_create(
slot_no = trx_rsegf_undo_find_free(rseg_hdr, mtr);
if (slot_no == ULINT_UNDEFINED) {
+ ut_print_timestamp(stderr);
+ fprintf(stderr,
+"InnoDB: Warning: cannot find a free slot for an undo log. Do you have too\n"
+"InnoDB: many active transactions running concurrently?");
return(NULL);
}
@@ -1532,9 +1536,6 @@ trx_undo_assign_undo(
mutex_exit(&(rseg->mutex));
mtr_commit(&mtr);
- fprintf(stderr, "InnoDB: no undo log slots free\n");
- ut_a(0);
-
return(NULL);
}
}
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index 64c9ecbcb7a..1f079b7488b 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -101,11 +101,18 @@ char* innobase_unix_file_flush_method = NULL;
/* Below we have boolean-valued start-up parameters, and their default
values */
-uint innobase_flush_log_at_trx_commit = 0;
my_bool innobase_log_archive = FALSE;
my_bool innobase_use_native_aio = FALSE;
my_bool innobase_fast_shutdown = TRUE;
+/* innodb_flush_log_at_trx_commit can now have 3 values:
+0 : write to the log file once per second and flush it to disk;
+1 : write to the log file at each commit and flush it to disk;
+2 : write to the log file at each commit, but flush to disk only once per
+second */
+
+uint innobase_flush_log_at_trx_commit = 0;
+
/*
Set default InnoDB data file size to 10 MB and let it be
auto-extending. Thus users can use InnoDB without having to
diff --git a/sql/ha_innodb.h b/sql/ha_innodb.h
index d70a58c75f1..978d504b117 100644
--- a/sql/ha_innodb.h
+++ b/sql/ha_innodb.h
@@ -182,6 +182,7 @@ extern long innobase_force_recovery, innobase_thread_concurrency;
extern char *innobase_data_home_dir, *innobase_data_file_path;
extern char *innobase_log_group_home_dir, *innobase_log_arch_dir;
extern char *innobase_unix_file_flush_method;
+extern long innobase_flush_log_at_trx_commit;
/* The following variables have to be my_bool for SHOW VARIABLES to work */
extern my_bool innobase_log_archive,
innobase_use_native_aio, innobase_fast_shutdown;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 75e6368712a..d5cf3d95c82 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -3036,10 +3036,10 @@ struct my_option my_long_options[] =
"Set to 1 if you want to have logs archived", 0, 0, 0, GET_LONG, OPT_ARG,
0, 0, 0, 0, 0, 0},
{"innodb_flush_log_at_trx_commit", OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT,
- "Set to 0 if you don't want to flush logs",
+ "Set to 0 (write and flush once per second), 1 (write and flush at each commit) or 2 (write at commit, flush once per second)",
(gptr*) &innobase_flush_log_at_trx_commit,
(gptr*) &innobase_flush_log_at_trx_commit,
- 0, GET_INT, OPT_ARG, 0, 0, 2, 0, 0, 0},
+ 0, GET_UINT, OPT_ARG, 0, 0, 2, 0, 0, 0},
{"innodb_flush_method", OPT_INNODB_FLUSH_METHOD,
"With which method to flush data", (gptr*) &innobase_unix_file_flush_method,
(gptr*) &innobase_unix_file_flush_method, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,