summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/suite/encryption/r/innodb-redo-badkey.result7
-rw-r--r--mysql-test/suite/encryption/t/innodb-redo-badkey.test7
-rw-r--r--mysql-test/suite/innodb_fts/r/fulltext_table_evict.result19
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext_table_evict.test49
-rw-r--r--mysql-test/unstable-tests1
-rw-r--r--sql/item_cmpfunc.cc4
-rw-r--r--sql/opt_subselect.h9
-rw-r--r--storage/innobase/dict/dict0dict.cc11
-rw-r--r--storage/innobase/dict/dict0load.cc27
-rw-r--r--storage/innobase/handler/ha_innodb.cc2
-rw-r--r--storage/innobase/handler/handler0alter.cc2
-rw-r--r--storage/innobase/include/dict0load.h7
-rw-r--r--storage/innobase/include/dict0priv.ic2
-rw-r--r--storage/innobase/log/log0recv.cc26
-rw-r--r--storage/innobase/row/row0mysql.cc6
-rw-r--r--storage/innobase/sync/sync0rw.cc24
16 files changed, 67 insertions, 136 deletions
diff --git a/mysql-test/suite/encryption/r/innodb-redo-badkey.result b/mysql-test/suite/encryption/r/innodb-redo-badkey.result
index 9104cac18da..2248c692076 100644
--- a/mysql-test/suite/encryption/r/innodb-redo-badkey.result
+++ b/mysql-test/suite/encryption/r/innodb-redo-badkey.result
@@ -1,9 +1,10 @@
call mtr.add_suppression("Plugin 'file_key_management'");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error.");
-call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file .*test/t[1-4]\\.ibd cannot be decrypted");
+call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test/t[1-4]\\.ibd' cannot be decrypted");
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
-call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t1\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]");
-call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t1 page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]");
+call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t[12]\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]");
+call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t[12] page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]");
+call mtr.add_suppression("InnoDB: Failed to read file '.*' at offset .*");
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
# Restart mysqld --file-key-management-filename=keys2.txt
diff --git a/mysql-test/suite/encryption/t/innodb-redo-badkey.test b/mysql-test/suite/encryption/t/innodb-redo-badkey.test
index 513e8724586..484246dbe32 100644
--- a/mysql-test/suite/encryption/t/innodb-redo-badkey.test
+++ b/mysql-test/suite/encryption/t/innodb-redo-badkey.test
@@ -5,10 +5,11 @@
call mtr.add_suppression("Plugin 'file_key_management'");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error.");
-call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file .*test/t[1-4]\\.ibd cannot be decrypted");
+call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test/t[1-4]\\.ibd' cannot be decrypted");
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
-call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t1\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]");
-call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t1 page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]");
+call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t[12]\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]");
+call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t[12] page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]");
+call mtr.add_suppression("InnoDB: Failed to read file '.*' at offset .*");
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
diff --git a/mysql-test/suite/innodb_fts/r/fulltext_table_evict.result b/mysql-test/suite/innodb_fts/r/fulltext_table_evict.result
deleted file mode 100644
index d9d329aa6c0..00000000000
--- a/mysql-test/suite/innodb_fts/r/fulltext_table_evict.result
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Bug Bug #27304661 MYSQL CRASH DOING SYNC INDEX ]
-# [FATAL] INNODB: SEMAPHORE WAIT HAS LASTED > 600
-#
-CREATE TABLE t1 (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-f1 TEXT(500),
-FULLTEXT idx (f1)
-) ENGINE=InnoDB;
-insert into t1 (f1) values ('fjdhfsjhf'),('dhjfhjshfj'),('dhjafjhfj');
-set @save_table_definition_cache=@@global.table_definition_cache;
-set @save_table_open_cache=@@global.table_open_cache;
-set global table_definition_cache=400;
-set global table_open_cache= 1024;
-SET @save_dbug = @@GLOBAL.debug_dbug;
-SET GLOBAL DEBUG_DBUG="+d,crash_if_fts_table_is_evicted";
-set @@global.table_definition_cache=@save_table_definition_cache;
-set @@global.table_open_cache=@save_table_open_cache;
-drop table t1;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext_table_evict.test b/mysql-test/suite/innodb_fts/t/fulltext_table_evict.test
deleted file mode 100644
index eaf50856c55..00000000000
--- a/mysql-test/suite/innodb_fts/t/fulltext_table_evict.test
+++ /dev/null
@@ -1,49 +0,0 @@
---source include/have_innodb.inc
---source include/have_debug.inc
---source include/big_test.inc
---source include/have_64bit.inc
-
---echo #
---echo # Bug Bug #27304661 MYSQL CRASH DOING SYNC INDEX ]
---echo # [FATAL] INNODB: SEMAPHORE WAIT HAS LASTED > 600
---echo #
-
-CREATE TABLE t1 (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- f1 TEXT(500),
- FULLTEXT idx (f1)
- ) ENGINE=InnoDB;
-insert into t1 (f1) values ('fjdhfsjhf'),('dhjfhjshfj'),('dhjafjhfj');
-
---source include/restart_mysqld.inc
-
-set @save_table_definition_cache=@@global.table_definition_cache;
-set @save_table_open_cache=@@global.table_open_cache;
-
-set global table_definition_cache=400;
-set global table_open_cache= 1024;
-
-SET @save_dbug = @@GLOBAL.debug_dbug;
-SET GLOBAL DEBUG_DBUG="+d,crash_if_fts_table_is_evicted";
-#Create 1000 tables, try the best to evict t1 .
-
---disable_query_log
-let $loop=1000;
-while($loop)
-{
- eval create table t_$loop(id int, name text(100), fulltext idxt_$loop(name) )engine=innodb;
- dec $loop;
-}
-
-let $loop=1000;
-while($loop)
-{
- eval drop table t_$loop;
- dec $loop;
-}
-
-SET GLOBAL DEBUG_DBUG = @save_dbug;
---enable_query_log
-set @@global.table_definition_cache=@save_table_definition_cache;
-set @@global.table_open_cache=@save_table_open_cache;
-drop table t1;
diff --git a/mysql-test/unstable-tests b/mysql-test/unstable-tests
index 6883dee42b3..b3719d00057 100644
--- a/mysql-test/unstable-tests
+++ b/mysql-test/unstable-tests
@@ -585,7 +585,6 @@ innodb.xa_recovery : MDEV-15279 - mysqld got exception
#-----------------------------------------------------------------------
innodb_fts.fulltext2 : Modified in 10.3.17
-innodb_fts.fulltext_table_evict : Modified in 10.3.18
innodb_fts.innodb_fts_misc : Modified in 10.3.18
innodb_fts.innodb_fts_misc_debug : MDEV-14156 - Unexpected warning
innodb_fts.innodb_fts_plugin : MDEV-13888 - Errors in server log
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index fe5ba3b2dad..f35b68c15a6 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -345,11 +345,9 @@ static bool convert_const_to_int(THD *thd, Item_field *field_item,
TABLE *table= field->table;
sql_mode_t orig_sql_mode= thd->variables.sql_mode;
enum_check_fields orig_count_cuted_fields= thd->count_cuted_fields;
- my_bitmap_map *old_maps[2];
+ my_bitmap_map *old_maps[2] = { NULL, NULL };
ulonglong UNINIT_VAR(orig_field_val); /* original field value if valid */
- LINT_INIT_STRUCT(old_maps);
-
/* table->read_set may not be set if we come here from a CREATE TABLE */
if (table && table->read_set)
dbug_tmp_use_all_columns(table, old_maps,
diff --git a/sql/opt_subselect.h b/sql/opt_subselect.h
index 395ceb86b2e..509fb370fd7 100644
--- a/sql/opt_subselect.h
+++ b/sql/opt_subselect.h
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2010, 2015, MariaDB
+ Copyright (c) 2010, 2019, MariaDB
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
@@ -92,7 +92,7 @@ class Loose_scan_opt
public:
Loose_scan_opt():
- try_loosescan(FALSE),
+ try_loosescan(false),
bound_sj_equalities(0),
quick_uses_applicable_index(0),
quick_max_loose_keypart(0),
@@ -100,10 +100,11 @@ public:
best_loose_scan_cost(0),
best_loose_scan_records(0),
best_loose_scan_start_key(NULL),
- best_max_loose_keypart(0)
+ best_max_loose_keypart(0),
+ best_ref_depend_map(0)
{
}
-
+
void init(JOIN *join, JOIN_TAB *s, table_map remaining_tables)
{
/*
diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc
index 17d0b864ac5..c84356f40c8 100644
--- a/storage/innobase/dict/dict0dict.cc
+++ b/storage/innobase/dict/dict0dict.cc
@@ -1156,7 +1156,7 @@ dict_table_open_on_name(
table = dict_table_check_if_in_cache_low(table_name);
if (table == NULL) {
- table = dict_load_table(table_name, true, ignore_err);
+ table = dict_load_table(table_name, ignore_err);
}
ut_ad(!table || table->cached);
@@ -1418,14 +1418,7 @@ dict_make_room_in_cache(
prev_table = UT_LIST_GET_PREV(table_LRU, table);
if (dict_table_can_be_evicted(table)) {
-
- DBUG_EXECUTE_IF("crash_if_fts_table_is_evicted",
- {
- if (table->fts &&
- dict_table_has_fts_index(table)) {
- ut_ad(0);
- }
- };);
+ ut_ad(!table->fts);
dict_table_remove_from_cache_low(table, TRUE);
++n_evicted;
diff --git a/storage/innobase/dict/dict0load.cc b/storage/innobase/dict/dict0load.cc
index 817a4059e8a..33330f329c3 100644
--- a/storage/innobase/dict/dict0load.cc
+++ b/storage/innobase/dict/dict0load.cc
@@ -69,7 +69,6 @@ NULL. These tables must be subsequently loaded so that all the foreign
key constraints are loaded into memory.
@param[in] name Table name in the db/tablename format
-@param[in] cached true=add to cache, false=do not
@param[in] ignore_err Error to be ignored when loading table
and its index definition
@param[out] fk_tables Related table names that must also be
@@ -82,7 +81,6 @@ static
dict_table_t*
dict_load_table_one(
const table_name_t& name,
- bool cached,
dict_err_ignore_t ignore_err,
dict_names_t& fk_tables);
@@ -2731,17 +2729,12 @@ the cluster definition if the table is a member in a cluster. Also loads
all foreign key constraints where the foreign key is in the table or where
a foreign key references columns in this table.
@param[in] name Table name in the dbname/tablename format
-@param[in] cached true=add to cache, false=do not
@param[in] ignore_err Error to be ignored when loading
table and its index definition
@return table, NULL if does not exist; if the table is stored in an
.ibd file, but the file does not exist, then we set the file_unreadable
flag in the table object we return. */
-dict_table_t*
-dict_load_table(
- const char* name,
- bool cached,
- dict_err_ignore_t ignore_err)
+dict_table_t* dict_load_table(const char* name, dict_err_ignore_t ignore_err)
{
dict_names_t fk_list;
dict_table_t* result;
@@ -2756,12 +2749,12 @@ dict_load_table(
if (!result) {
result = dict_load_table_one(const_cast<char*>(name),
- cached, ignore_err, fk_list);
+ ignore_err, fk_list);
while (!fk_list.empty()) {
if (!dict_table_check_if_in_cache_low(fk_list.front()))
dict_load_table_one(
const_cast<char*>(fk_list.front()),
- cached, ignore_err, fk_list);
+ ignore_err, fk_list);
fk_list.pop_front();
}
}
@@ -2854,7 +2847,6 @@ NULL. These tables must be subsequently loaded so that all the foreign
key constraints are loaded into memory.
@param[in] name Table name in the db/tablename format
-@param[in] cached true=add to cache, false=do not
@param[in] ignore_err Error to be ignored when loading table
and its index definition
@param[out] fk_tables Related table names that must also be
@@ -2867,7 +2859,6 @@ static
dict_table_t*
dict_load_table_one(
const table_name_t& name,
- bool cached,
dict_err_ignore_t ignore_err,
dict_names_t& fk_tables)
{
@@ -2956,10 +2947,8 @@ err_exit:
dict_table_add_system_columns(table, heap);
- if (cached) {
- table->can_be_evicted = true;
- table->add_to_cache();
- }
+ table->can_be_evicted = true;
+ table->add_to_cache();
mem_heap_empty(heap);
@@ -2997,7 +2986,7 @@ err_exit:
}
}
- if (err == DB_SUCCESS && cached && table->is_readable()) {
+ if (err == DB_SUCCESS && table->is_readable()) {
if (table->space && !fil_space_get_size(table->space_id)) {
corrupted:
table->corrupted = true;
@@ -3042,7 +3031,7 @@ corrupted:
of the error condition, since the user may want to dump data from the
clustered index. However we load the foreign key information only if
all indexes were loaded. */
- if (!cached || !table->is_readable()) {
+ if (!table->is_readable()) {
/* Don't attempt to load the indexes from disk. */
} else if (err == DB_SUCCESS) {
err = dict_load_foreigns(table->name.m_name, NULL,
@@ -3194,7 +3183,7 @@ check_rec:
/* Load the table definition to memory */
char* table_name = mem_heap_strdupl(
heap, (char*) field, len);
- table = dict_load_table(table_name, true, ignore_err);
+ table = dict_load_table(table_name, ignore_err);
}
}
}
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 06a9b74546b..5aedd678d4a 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -12449,7 +12449,7 @@ int create_table_info_t::create_table(bool create_fk)
DICT_ERR_IGNORE_NONE,
fk_tables);
while (err == DB_SUCCESS && !fk_tables.empty()) {
- dict_load_table(fk_tables.front(), true,
+ dict_load_table(fk_tables.front(),
DICT_ERR_IGNORE_NONE);
fk_tables.pop_front();
}
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index e0aed9cbc7b..1450624c0c2 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -8212,7 +8212,7 @@ innobase_update_foreign_cache(
also be loaded. */
while (err == DB_SUCCESS && !fk_tables.empty()) {
dict_table_t* table = dict_load_table(
- fk_tables.front(), true, DICT_ERR_IGNORE_NONE);
+ fk_tables.front(), DICT_ERR_IGNORE_NONE);
if (table == NULL) {
err = DB_TABLE_NOT_FOUND;
diff --git a/storage/innobase/include/dict0load.h b/storage/innobase/include/dict0load.h
index cc2d3fa1c45..8af04f9fd9d 100644
--- a/storage/innobase/include/dict0load.h
+++ b/storage/innobase/include/dict0load.h
@@ -101,17 +101,12 @@ the cluster definition if the table is a member in a cluster. Also loads
all foreign key constraints where the foreign key is in the table or where
a foreign key references columns in this table.
@param[in] name Table name in the dbname/tablename format
-@param[in] cached true=add to cache, false=do not
@param[in] ignore_err Error to be ignored when loading
table and its index definition
@return table, NULL if does not exist; if the table is stored in an
.ibd file, but the file does not exist, then we set the file_unreadable
flag in the table object we return. */
-dict_table_t*
-dict_load_table(
- const char* name,
- bool cached,
- dict_err_ignore_t ignore_err);
+dict_table_t* dict_load_table(const char* name, dict_err_ignore_t ignore_err);
/***********************************************************************//**
Loads a table object based on the table id.
diff --git a/storage/innobase/include/dict0priv.ic b/storage/innobase/include/dict0priv.ic
index f717ddd313a..7b584c7e1cb 100644
--- a/storage/innobase/include/dict0priv.ic
+++ b/storage/innobase/include/dict0priv.ic
@@ -55,7 +55,7 @@ dict_table_get_low(
}
if (table == NULL) {
- table = dict_load_table(table_name, true, DICT_ERR_IGNORE_NONE);
+ table = dict_load_table(table_name, DICT_ERR_IGNORE_NONE);
}
ut_ad(!table || table->cached);
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc
index ec538042d37..c6908a61dc2 100644
--- a/storage/innobase/log/log0recv.cc
+++ b/storage/innobase/log/log0recv.cc
@@ -2182,18 +2182,20 @@ void recv_recover_corrupt_page(page_id_t page_id)
mutex_enter(&recv_sys->mutex);
if (!recv_sys->apply_log_recs) {
- mutex_exit(&recv_sys->mutex);
- return;
- }
-
- recv_addr_t* recv_addr = recv_get_fil_addr_struct(
- page_id.space(), page_id.page_no());
-
- ut_ad(recv_addr->state != RECV_WILL_NOT_READ);
-
- if (recv_addr->state != RECV_BEING_PROCESSED
- && recv_addr->state != RECV_PROCESSED) {
- recv_sys->n_addrs--;
+ } else if (recv_addr_t* recv_addr = recv_get_fil_addr_struct(
+ page_id.space(), page_id.page_no())) {
+ switch (recv_addr->state) {
+ case RECV_WILL_NOT_READ:
+ ut_ad(!"wrong state");
+ break;
+ case RECV_BEING_PROCESSED:
+ case RECV_PROCESSED:
+ break;
+ default:
+ recv_addr->state = RECV_PROCESSED;
+ ut_ad(recv_sys->n_addrs);
+ recv_sys->n_addrs--;
+ }
}
mutex_exit(&recv_sys->mutex);
diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc
index eed6b2bba63..af1dcfdb0c1 100644
--- a/storage/innobase/row/row0mysql.cc
+++ b/storage/innobase/row/row0mysql.cc
@@ -2777,7 +2777,7 @@ row_mysql_drop_garbage_tables()
btr_pcur_store_position(&pcur, &mtr);
btr_pcur_commit_specify_mtr(&pcur, &mtr);
- if (dict_load_table(table_name, true,
+ if (dict_load_table(table_name,
DICT_ERR_IGNORE_DROP)) {
row_drop_table_for_mysql(table_name, trx,
SQLCOM_DROP_TABLE);
@@ -3278,7 +3278,7 @@ row_drop_table_from_cache(
dict_table_remove_from_cache(table);
- if (dict_load_table(tablename, true, DICT_ERR_IGNORE_FK_NOKEY)) {
+ if (dict_load_table(tablename, DICT_ERR_IGNORE_FK_NOKEY)) {
ib::error() << "Not able to remove table "
<< ut_get_name(trx, tablename)
<< " from the dictionary cache!";
@@ -4599,7 +4599,7 @@ end:
dict_mem_table_fill_foreign_vcol_set(table);
while (!fk_tables.empty()) {
- dict_load_table(fk_tables.front(), true,
+ dict_load_table(fk_tables.front(),
DICT_ERR_IGNORE_NONE);
fk_tables.pop_front();
}
diff --git a/storage/innobase/sync/sync0rw.cc b/storage/innobase/sync/sync0rw.cc
index 658a0f906a7..f075e01c857 100644
--- a/storage/innobase/sync/sync0rw.cc
+++ b/storage/innobase/sync/sync0rw.cc
@@ -994,13 +994,22 @@ rw_lock_own(
ut_ad(lock);
ut_ad(rw_lock_validate(lock));
+ const os_thread_id_t thread_id = os_thread_get_curr_id();
+
+ if (!os_thread_eq(lock->writer_thread, thread_id)) {
+ } else if (lock_type == RW_LOCK_X && rw_lock_get_x_lock_count(lock)) {
+ return TRUE;
+ } else if (lock_type == RW_LOCK_SX && rw_lock_get_sx_lock_count(lock)) {
+ return TRUE;
+ }
+
rw_lock_debug_mutex_enter();
for (const rw_lock_debug_t* info = UT_LIST_GET_FIRST(lock->debug_list);
info != NULL;
info = UT_LIST_GET_NEXT(list, info)) {
- if (os_thread_eq(info->thread_id, os_thread_get_curr_id())
+ if (os_thread_eq(info->thread_id, thread_id)
&& info->pass == 0
&& info->lock_type == lock_type) {
@@ -1025,12 +1034,23 @@ bool rw_lock_own_flagged(const rw_lock_t* lock, rw_lock_flags_t flags)
{
ut_ad(rw_lock_validate(lock));
+ const os_thread_id_t thread_id = os_thread_get_curr_id();
+
+ if (!os_thread_eq(lock->writer_thread, thread_id)) {
+ } else if ((flags & RW_LOCK_FLAG_X)
+ && rw_lock_get_x_lock_count(lock)) {
+ return true;
+ } else if ((flags & RW_LOCK_FLAG_SX)
+ && rw_lock_get_sx_lock_count(lock)) {
+ return true;
+ }
+
rw_lock_debug_mutex_enter();
for (rw_lock_debug_t* info = UT_LIST_GET_FIRST(lock->debug_list);
info != NULL;
info = UT_LIST_GET_NEXT(list, info)) {
- if (!os_thread_eq(info->thread_id, os_thread_get_curr_id())
+ if (!os_thread_eq(info->thread_id, thread_id)
|| info->pass) {
continue;
}