summaryrefslogtreecommitdiff
path: root/storage/innobase
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-03-27 17:12:28 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2021-03-27 17:12:28 +0200
commit7ae37ff74fc18c391bd0d3fd1fbf6afafe966435 (patch)
tree792d8852dd9aaa06b5ddfb374f02774b18ed150c /storage/innobase
parentd1ff2c583f452d8e1899f800609c329c998f0a33 (diff)
parent3157fa182accab86a4dea45edbcbca4eb5157723 (diff)
downloadmariadb-git-7ae37ff74fc18c391bd0d3fd1fbf6afafe966435.tar.gz
Merge 10.3 into 10.4
Diffstat (limited to 'storage/innobase')
-rw-r--r--storage/innobase/btr/btr0pcur.cc5
-rw-r--r--storage/innobase/handler/ha_innodb.cc28
-rw-r--r--storage/innobase/handler/ha_innodb.h4
-rw-r--r--storage/innobase/include/srv0srv.h3
-rw-r--r--storage/innobase/page/page0zip.cc27
-rw-r--r--storage/innobase/row/row0merge.cc4
-rw-r--r--storage/innobase/row/row0upd.cc131
-rw-r--r--storage/innobase/srv/srv0srv.cc3
8 files changed, 57 insertions, 148 deletions
diff --git a/storage/innobase/btr/btr0pcur.cc b/storage/innobase/btr/btr0pcur.cc
index a8db6e22c0a..b74d2f9f37d 100644
--- a/storage/innobase/btr/btr0pcur.cc
+++ b/storage/innobase/btr/btr0pcur.cc
@@ -166,13 +166,8 @@ before_first:
if (rec_is_metadata(rec, *index)) {
ut_ad(!page_has_prev(block->frame));
- ut_d(const rec_t* p = rec);
rec = page_rec_get_next(rec);
if (page_rec_is_supremum(rec)) {
- ut_ad(page_has_next(block->frame)
- || rec_is_alter_metadata(p, *index)
- || block->page.id.page_no()
- != index->page);
goto before_first;
}
}
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index d6efaecc44c..84a51c8aac0 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -201,7 +201,6 @@ static char* innodb_large_prefix;
stopword table to be used */
static char* innobase_server_stopword_table;
-static my_bool innobase_use_atomic_writes;
static my_bool innobase_use_checksums;
static my_bool innobase_locks_unsafe_for_binlog;
static my_bool innobase_rollback_on_timeout;
@@ -4113,21 +4112,16 @@ static int innodb_init_params()
innobase_commit_concurrency_init_default();
- srv_use_atomic_writes
- = innobase_use_atomic_writes && my_may_have_atomic_write;
- if (srv_use_atomic_writes && !srv_file_per_table)
- {
- fprintf(stderr, "InnoDB: Disabling atomic_writes as file_per_table is not used.\n");
- srv_use_atomic_writes= 0;
- }
+ if (innodb_idle_flush_pct != 100) {
+ ib::warn() << deprecated_idle_flush_pct;
+ }
- if (srv_use_atomic_writes) {
- fprintf(stderr, "InnoDB: using atomic writes.\n");
+#ifndef _WIN32
+ if (srv_use_atomic_writes && my_may_have_atomic_write) {
/*
Force O_DIRECT on Unixes (on Windows writes are always
unbuffered)
*/
-#ifndef _WIN32
switch (innodb_flush_method) {
case SRV_O_DIRECT:
case SRV_O_DIRECT_NO_FSYNC:
@@ -4136,8 +4130,8 @@ static int innodb_init_params()
innodb_flush_method = SRV_O_DIRECT;
fprintf(stderr, "InnoDB: using O_DIRECT due to atomic writes.\n");
}
-#endif
}
+#endif
if (srv_read_only_mode) {
ib::info() << "Started in read only mode";
@@ -19014,12 +19008,10 @@ static MYSQL_SYSVAR_BOOL(doublewrite, srv_use_doublewrite_buf,
" Disable with --skip-innodb-doublewrite.",
NULL, NULL, TRUE);
-static MYSQL_SYSVAR_BOOL(use_atomic_writes, innobase_use_atomic_writes,
+static MYSQL_SYSVAR_BOOL(use_atomic_writes, srv_use_atomic_writes,
PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
"Enable atomic writes, instead of using the doublewrite buffer, for files "
"on devices that supports atomic writes. "
- "To use this option one must use "
- "innodb_file_per_table=1, innodb_flush_method=O_DIRECT. "
"This option only works on Linux with either FusionIO cards using "
"the directFS filesystem or with Shannon cards using any file system.",
NULL, NULL, TRUE);
@@ -20029,11 +20021,6 @@ static MYSQL_SYSVAR_BOOL(master_thread_disabled_debug,
PLUGIN_VAR_OPCMDARG,
"Disable master thread",
NULL, srv_master_thread_disabled_debug_update, FALSE);
-
-static MYSQL_SYSVAR_UINT(simulate_comp_failures, srv_simulate_comp_failures,
- PLUGIN_VAR_NOCMDARG,
- "Simulate compression failures.",
- NULL, NULL, 0, 0, 99, 0);
#endif /* UNIV_DEBUG */
static MYSQL_SYSVAR_BOOL(force_primary_key,
@@ -20350,7 +20337,6 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
MYSQL_SYSVAR(compression_pad_pct_max),
MYSQL_SYSVAR(default_row_format),
#ifdef UNIV_DEBUG
- MYSQL_SYSVAR(simulate_comp_failures),
MYSQL_SYSVAR(trx_rseg_n_slots_debug),
MYSQL_SYSVAR(limit_optimistic_insert_debug),
MYSQL_SYSVAR(trx_purge_view_update_only_debug),
diff --git a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h
index b0f6789cde2..619dfca34fb 100644
--- a/storage/innobase/handler/ha_innodb.h
+++ b/storage/innobase/handler/ha_innodb.h
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2013, 2020, MariaDB Corporation.
+Copyright (c) 2013, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -45,7 +45,7 @@ struct ha_table_option_struct
uint atomic_writes; /*!< Use atomic writes for this
table if this options is ON or
in DEFAULT if
- srv_use_atomic_writes=1.
+ innodb_use_atomic_writes.
Atomic writes are not used if
value OFF.*/
uint encryption; /*!< DEFAULT, ON, OFF */
diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
index f7a5cb5b29e..8dcba6e6bc5 100644
--- a/storage/innobase/include/srv0srv.h
+++ b/storage/innobase/include/srv0srv.h
@@ -592,9 +592,6 @@ extern struct export_var_t export_vars;
/** Global counters */
extern srv_stats_t srv_stats;
-/** Simulate compression failures. */
-extern uint srv_simulate_comp_failures;
-
/** Fatal semaphore wait threshold = maximum number of seconds
that semaphore times out in InnoDB */
#define DEFAULT_SRV_FATAL_SEMAPHORE_TIMEOUT 600
diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc
index eb94aad207c..a84f1e489a2 100644
--- a/storage/innobase/page/page0zip.cc
+++ b/storage/innobase/page/page0zip.cc
@@ -1349,33 +1349,6 @@ page_zip_compress(
MONITOR_INC(MONITOR_PAGE_COMPRESS);
- /* Simulate a compression failure with a probability determined by
- innodb_simulate_comp_failures, only if the page has 2 or more
- records. */
-
- if (srv_simulate_comp_failures
- && !dict_index_is_ibuf(index)
- && page_get_n_recs(page) >= 2
- && ((ulint)(rand() % 100) < srv_simulate_comp_failures)
- && strcmp(index->table->name.m_name, "IBUF_DUMMY")) {
-
-#ifdef UNIV_DEBUG
- ib::error()
- << "Simulating a compression failure"
- << " for table " << index->table->name
- << " index "
- << index->name()
- << " page "
- << page_get_page_no(page)
- << "("
- << (page_is_leaf(page) ? "leaf" : "non-leaf")
- << ")";
-
-#endif
-
- goto err_exit;
- }
-
heap = mem_heap_create(page_zip_get_size(page_zip)
+ n_fields * (2 + sizeof(ulint))
+ REC_OFFS_HEADER_SIZE
diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc
index a0dd06f3ddf..72b33c127de 100644
--- a/storage/innobase/row/row0merge.cc
+++ b/storage/innobase/row/row0merge.cc
@@ -4857,10 +4857,6 @@ wait_again:
buf, i + 1, n_indexes);
}
- DBUG_EXECUTE_IF(
- "ib_merge_wait_after_sort",
- os_thread_sleep(20000000);); /* 20 sec */
-
if (error == DB_SUCCESS) {
BtrBulk btr_bulk(sort_idx, trx,
trx->get_flush_observer());
diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc
index 6dd3ce9ce2a..a89b58da493 100644
--- a/storage/innobase/row/row0upd.cc
+++ b/storage/innobase/row/row0upd.cc
@@ -126,25 +126,23 @@ NOTE that since we do not hold dict_sys.latch when leaving the
function, it may be that the referencing table has been dropped when
we leave this function: this function is only for heuristic use!
-@return TRUE if referenced */
+@return true if referenced */
static
-ibool
+bool
row_upd_index_is_referenced(
/*========================*/
dict_index_t* index, /*!< in: index */
trx_t* trx) /*!< in: transaction */
{
dict_table_t* table = index->table;
- ibool froze_data_dict = FALSE;
- ibool is_referenced = FALSE;
if (table->referenced_set.empty()) {
- return(FALSE);
+ return false;
}
- if (trx->dict_operation_lock_mode == 0) {
+ const bool froze_data_dict = !trx->dict_operation_lock_mode;
+ if (froze_data_dict) {
row_mysql_freeze_data_dictionary(trx);
- froze_data_dict = TRUE;
}
dict_foreign_set::iterator it
@@ -152,13 +150,13 @@ row_upd_index_is_referenced(
table->referenced_set.end(),
dict_foreign_with_index(index));
- is_referenced = (it != table->referenced_set.end());
+ const bool is_referenced = (it != table->referenced_set.end());
if (froze_data_dict) {
row_mysql_unfreeze_data_dictionary(trx);
}
- return(is_referenced);
+ return is_referenced;
}
#ifdef WITH_WSREP
@@ -2264,7 +2262,6 @@ row_upd_sec_index_entry(
dtuple_t* entry;
dict_index_t* index;
btr_cur_t* btr_cur;
- ibool referenced;
dberr_t err = DB_SUCCESS;
trx_t* trx = thr_get_trx(thr);
ulint mode;
@@ -2275,7 +2272,7 @@ row_upd_sec_index_entry(
index = node->index;
- referenced = row_upd_index_is_referenced(index, trx);
+ const bool referenced = row_upd_index_is_referenced(index, trx);
#ifdef WITH_WSREP
bool foreign = wsrep_row_upd_index_is_foreign(index, trx);
#endif /* WITH_WSREP */
@@ -2682,12 +2679,13 @@ row_upd_clust_rec_by_insert(
upd_node_t* node, /*!< in/out: row update node */
dict_index_t* index, /*!< in: clustered index of the record */
que_thr_t* thr, /*!< in: query thread */
- ibool referenced,/*!< in: TRUE if index may be referenced in
+ bool referenced,/*!< in: whether index may be referenced in
a foreign key constraint */
#ifdef WITH_WSREP
bool foreign,/*!< in: whether this is a foreign key */
#endif
- mtr_t* mtr) /*!< in/out: mtr; gets committed here */
+ mtr_t* mtr) /*!< in/out: mini-transaction,
+ may be committed and restarted */
{
mem_heap_t* heap;
btr_pcur_t* pcur;
@@ -2757,10 +2755,7 @@ row_upd_clust_rec_by_insert(
btr_cur_get_block(btr_cur), rec, index, offsets,
thr, node->row, mtr);
if (err != DB_SUCCESS) {
-err_exit:
- mtr_commit(mtr);
- mem_heap_free(heap);
- return(err);
+ goto err_exit;
}
/* If the the new row inherits externally stored
@@ -2820,14 +2815,14 @@ check_fk:
}
}
- mtr_commit(mtr);
+ mtr->commit();
+ mtr->start();
+ node->state = UPD_NODE_INSERT_CLUSTERED;
err = row_ins_clust_index_entry(index, entry, thr,
dtuple_get_n_ext(entry));
- node->state = UPD_NODE_INSERT_CLUSTERED;
-
+err_exit:
mem_heap_free(heap);
-
return(err);
}
@@ -2847,7 +2842,8 @@ row_upd_clust_rec(
mem_heap_t** offsets_heap,
/*!< in/out: memory heap, can be emptied */
que_thr_t* thr, /*!< in: query thread */
- mtr_t* mtr) /*!< in: mtr; gets committed here */
+ mtr_t* mtr) /*!< in,out: mini-transaction; may be
+ committed and restarted here */
{
mem_heap_t* heap = NULL;
big_rec_t* big_rec = NULL;
@@ -2893,16 +2889,15 @@ row_upd_clust_rec(
goto success;
}
- mtr_commit(mtr);
-
if (buf_LRU_buf_pool_running_out()) {
-
err = DB_LOCK_TABLE_FULL;
goto func_exit;
}
+
/* We may have to modify the tree structure: do a pessimistic descent
down the index tree */
+ mtr->commit();
mtr->start();
if (index->table->is_temporary()) {
@@ -2952,7 +2947,6 @@ success:
}
}
- mtr_commit(mtr);
func_exit:
if (heap) {
mem_heap_free(heap);
@@ -2977,17 +2971,17 @@ row_upd_del_mark_clust_rec(
rec_offs* offsets,/*!< in/out: rec_get_offsets() for the
record under the cursor */
que_thr_t* thr, /*!< in: query thread */
- ibool referenced,
- /*!< in: TRUE if index may be referenced in
+ bool referenced,
+ /*!< in: whether index may be referenced in
a foreign key constraint */
#ifdef WITH_WSREP
bool foreign,/*!< in: whether this is a foreign key */
#endif
- mtr_t* mtr) /*!< in: mtr; gets committed here */
+ mtr_t* mtr) /*!< in,out: mini-transaction;
+ will be committed and restarted */
{
btr_pcur_t* pcur;
btr_cur_t* btr_cur;
- dberr_t err;
rec_t* rec;
trx_t* trx = thr_get_trx(thr);
@@ -3003,8 +2997,7 @@ row_upd_del_mark_clust_rec(
if (!row_upd_store_row(node, trx->mysql_thd,
thr->prebuilt && thr->prebuilt->table == node->table
? thr->prebuilt->m_mysql_table : NULL)) {
- err = DB_COMPUTE_VALUE_FAILED;
- return err;
+ return DB_COMPUTE_VALUE_FAILED;
}
/* Mark the clustered index record deleted; we do not have to check
@@ -3012,7 +3005,7 @@ row_upd_del_mark_clust_rec(
rec = btr_cur_get_rec(btr_cur);
- err = btr_cur_del_mark_set_clust_rec(
+ dberr_t err = btr_cur_del_mark_set_clust_rec(
btr_cur_get_block(btr_cur), rec,
index, offsets, thr, node->row, mtr);
@@ -3049,8 +3042,6 @@ row_upd_del_mark_clust_rec(
#endif /* WITH_WSREP */
}
- mtr_commit(mtr);
-
return(err);
}
@@ -3067,14 +3058,12 @@ row_upd_clust_step(
{
dict_index_t* index;
btr_pcur_t* pcur;
- ibool success;
dberr_t err;
mtr_t mtr;
rec_t* rec;
mem_heap_t* heap = NULL;
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
rec_offs* offsets;
- ibool referenced;
ulint flags;
trx_t* trx = thr_get_trx(thr);
@@ -3082,8 +3071,7 @@ row_upd_clust_step(
index = dict_table_get_first_index(node->table);
- referenced = row_upd_index_is_referenced(index, trx);
-
+ const bool referenced = row_upd_index_is_referenced(index, trx);
#ifdef WITH_WSREP
const bool foreign = wsrep_row_upd_index_is_foreign(index, trx);
#endif
@@ -3129,14 +3117,9 @@ row_upd_clust_step(
mode = BTR_MODIFY_LEAF;
}
- success = btr_pcur_restore_position(mode, pcur, &mtr);
-
- if (!success) {
+ if (!btr_pcur_restore_position(mode, pcur, &mtr)) {
err = DB_RECORD_NOT_FOUND;
-
- mtr_commit(&mtr);
-
- return(err);
+ goto exit_func;
}
/* If this is a row in SYS_INDEXES table of the data dictionary,
@@ -3156,14 +3139,9 @@ row_upd_clust_step(
mtr.start();
index->set_modified(mtr);
- success = btr_pcur_restore_position(BTR_MODIFY_LEAF, pcur,
- &mtr);
- if (!success) {
+ if (!btr_pcur_restore_position(BTR_MODIFY_LEAF, pcur, &mtr)) {
err = DB_ERROR;
-
- mtr.commit();
-
- return(err);
+ goto exit_func;
}
}
@@ -3176,7 +3154,6 @@ row_upd_clust_step(
0, btr_pcur_get_block(pcur),
rec, index, offsets, thr);
if (err != DB_SUCCESS) {
- mtr.commit();
goto exit_func;
}
}
@@ -3187,8 +3164,6 @@ row_upd_clust_step(
btr_pcur_get_block(pcur),
page_rec_get_heap_no(rec)));
- /* NOTE: the following function calls will also commit mtr */
-
if (node->is_delete == PLAIN_DELETE) {
err = row_upd_del_mark_clust_rec(
node, index, offsets, thr, referenced,
@@ -3196,13 +3171,7 @@ row_upd_clust_step(
foreign,
#endif
&mtr);
-
- if (err == DB_SUCCESS) {
- node->state = UPD_NODE_UPDATE_ALL_SEC;
- node->index = dict_table_get_next_index(index);
- }
-
- goto exit_func;
+ goto all_done;
}
/* If the update is made for MySQL, we already have the update vector
@@ -3217,14 +3186,13 @@ row_upd_clust_step(
}
if (!node->is_delete && node->cmpl_info & UPD_NODE_NO_ORD_CHANGE) {
-
err = row_upd_clust_rec(
flags, node, index, offsets, &heap, thr, &mtr);
goto exit_func;
}
- if(!row_upd_store_row(node, trx->mysql_thd,
- thr->prebuilt ? thr->prebuilt->m_mysql_table : NULL)) {
+ if (!row_upd_store_row(node, trx->mysql_thd, thr->prebuilt
+ ? thr->prebuilt->m_mysql_table : NULL)) {
err = DB_COMPUTE_VALUE_FAILED;
goto exit_func;
}
@@ -3249,34 +3217,31 @@ row_upd_clust_step(
foreign,
#endif
&mtr);
- if (err != DB_SUCCESS) {
-
- goto exit_func;
+all_done:
+ if (err == DB_SUCCESS) {
+ node->state = UPD_NODE_UPDATE_ALL_SEC;
+success:
+ node->index = dict_table_get_next_index(index);
}
-
- node->state = UPD_NODE_UPDATE_ALL_SEC;
} else {
err = row_upd_clust_rec(
flags, node, index, offsets, &heap, thr, &mtr);
- if (err != DB_SUCCESS) {
-
- goto exit_func;
+ if (err == DB_SUCCESS) {
+ ut_ad(node->is_delete != PLAIN_DELETE);
+ node->state = node->is_delete
+ ? UPD_NODE_UPDATE_ALL_SEC
+ : UPD_NODE_UPDATE_SOME_SEC;
+ goto success;
}
-
- ut_ad(node->is_delete != PLAIN_DELETE);
- node->state = node->is_delete ?
- UPD_NODE_UPDATE_ALL_SEC :
- UPD_NODE_UPDATE_SOME_SEC;
}
- node->index = dict_table_get_next_index(index);
-
exit_func:
- if (heap) {
+ mtr.commit();
+ if (UNIV_LIKELY_NULL(heap)) {
mem_heap_free(heap);
}
- return(err);
+ return err;
}
/***********************************************************//**
diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc
index 2f930694821..d47b33ee851 100644
--- a/storage/innobase/srv/srv0srv.cc
+++ b/storage/innobase/srv/srv0srv.cc
@@ -481,9 +481,6 @@ current_time % 5 != 0. */
#endif /* MEM_PERIODIC_CHECK */
# define SRV_MASTER_DICT_LRU_INTERVAL (47)
-/** Simulate compression failures. */
-UNIV_INTERN uint srv_simulate_comp_failures;
-
/** Buffer pool dump status frequence in percentages */
UNIV_INTERN ulong srv_buf_dump_status_frequency;