Commit 8b7521eb authored by monty@mashka.mysql.fi's avatar monty@mashka.mysql.fi

Merge with 3.23.53

parents fa4e07bf 75a39efa
......@@ -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.
......@@ -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) {
......
......@@ -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");
}
......
......@@ -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);
......
......@@ -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";
......
......@@ -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"
......
......@@ -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);
}
}
......
......@@ -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
......
......@@ -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;
......
......@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment