diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-09-27 16:26:53 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-09-27 16:26:53 +0300 |
commit | 9b5cdeeb0f3fa9540df50d7feec8a703db4777ab (patch) | |
tree | c487800462d4705f07ac6f0bfd4234646fa688d7 | |
parent | ea2b19dee6a6ed69faffa368c9b1ce9338556299 (diff) | |
parent | 2911a9a693512ec7d4903313028d252a8374e56e (diff) | |
download | mariadb-git-9b5cdeeb0f3fa9540df50d7feec8a703db4777ab.tar.gz |
Merge 10.3 into 10.4
-rw-r--r-- | mysql-test/suite/encryption/r/innodb-redo-badkey.result | 7 | ||||
-rw-r--r-- | mysql-test/suite/encryption/t/innodb-redo-badkey.test | 7 | ||||
-rw-r--r-- | mysql-test/suite/innodb_fts/r/fulltext_table_evict.result | 19 | ||||
-rw-r--r-- | mysql-test/suite/innodb_fts/t/fulltext_table_evict.test | 50 | ||||
-rw-r--r-- | mysql-test/unstable-tests | 1 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 4 | ||||
-rw-r--r-- | sql/opt_subselect.h | 7 | ||||
-rw-r--r-- | storage/innobase/dict/dict0dict.cc | 11 | ||||
-rw-r--r-- | storage/innobase/dict/dict0load.cc | 27 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 2 | ||||
-rw-r--r-- | storage/innobase/handler/handler0alter.cc | 2 | ||||
-rw-r--r-- | storage/innobase/include/dict0load.h | 7 | ||||
-rw-r--r-- | storage/innobase/include/dict0priv.ic | 2 | ||||
-rw-r--r-- | storage/innobase/log/log0recv.cc | 26 | ||||
-rw-r--r-- | storage/innobase/row/row0mysql.cc | 6 | ||||
-rw-r--r-- | storage/innobase/sync/sync0rw.cc | 24 |
16 files changed, 66 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 38de3f53476..33746dd9a11 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: --file-key-management-filename=MYSQL_TEST_DIR/std_data/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 b1e1be66a7a..ecdd97af2a6 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 d95c551e2db..00000000000 --- a/mysql-test/suite/innodb_fts/t/fulltext_table_evict.test +++ /dev/null @@ -1,50 +0,0 @@ ---source include/have_innodb.inc ---source include/have_debug.inc ---source include/big_test.inc ---source include/have_64bit.inc -let $restart_noprint=2; - ---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 99ae288df93..516c704b3f5 100644 --- a/mysql-test/unstable-tests +++ b/mysql-test/unstable-tests @@ -623,7 +623,6 @@ innodb.xa_recovery : MDEV-15279 - mysqld got exception #----------------------------------------------------------------------- innodb_fts.fulltext2 : Modified in 10.4.7 -innodb_fts.fulltext_table_evict : Modified in 10.4.8 innodb_fts.innodb_fts_misc : Modified in 10.4.8 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 e656b23b8ee..9110f348a43 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -321,11 +321,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 14730ecbd11..d7978e9ef73 100644 --- a/sql/opt_subselect.h +++ b/sql/opt_subselect.h @@ -95,7 +95,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), @@ -103,10 +103,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 7b0cc8ccdb2..a6b55600ebd 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -888,7 +888,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); @@ -1137,14 +1137,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_sys.remove(table, true); ++n_evicted; diff --git a/storage/innobase/dict/dict0load.cc b/storage/innobase/dict/dict0load.cc index 0552145ab07..6007252a308 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); @@ -2728,17 +2726,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; @@ -2753,12 +2746,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(); } } @@ -2851,7 +2844,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 @@ -2864,7 +2856,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) { @@ -2953,10 +2944,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); @@ -2994,7 +2983,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; @@ -3038,7 +3027,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, @@ -3190,7 +3179,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 105928d69a8..32f6d016ff7 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -12460,7 +12460,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 5c52f74e79e..138a420040d 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -9593,7 +9593,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 8fda39b339b..df345e741ba 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 68b228c9102..ff645378175 100644 --- a/storage/innobase/include/dict0priv.ic +++ b/storage/innobase/include/dict0priv.ic @@ -54,7 +54,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 52edbcf238f..9e886aca902 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -2109,18 +2109,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 1787fbb739f..63e59956989 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -2763,7 +2763,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); @@ -3274,7 +3274,7 @@ row_drop_table_from_cache( dict_sys.remove(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!"; @@ -4593,7 +4593,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 d05b9475b34..2795fc902fc 100644 --- a/storage/innobase/sync/sync0rw.cc +++ b/storage/innobase/sync/sync0rw.cc @@ -986,13 +986,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) { @@ -1017,12 +1026,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; } |