summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/main/query_cache_notembedded.result21
-rw-r--r--mysql-test/main/query_cache_notembedded.test27
-rw-r--r--mysql-test/suite/binlog/r/binlog_checkpoint.result25
-rw-r--r--mysql-test/suite/binlog/t/binlog_checkpoint.test18
-rw-r--r--mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result8
-rw-r--r--mysql-test/suite/innodb/r/log_corruption.result8
-rw-r--r--mysql-test/suite/innodb/t/log_corruption.test37
-rw-r--r--plugin/password_reuse_check/CMakeLists.txt3
-rw-r--r--sql/share/errmsg-utf8.txt4
-rw-r--r--sql/sql_cache.cc16
-rw-r--r--sql/sql_cache.h5
-rw-r--r--sql/sql_table.cc6
-rw-r--r--storage/innobase/buf/buf0dump.cc73
-rw-r--r--storage/innobase/buf/buf0lru.cc16
-rw-r--r--storage/innobase/dict/dict0boot.cc23
-rw-r--r--storage/innobase/ibuf/ibuf0ibuf.cc36
-rw-r--r--storage/innobase/include/univ.i9
-rw-r--r--storage/innobase/log/log0recv.cc34
-rw-r--r--storage/innobase/mtr/mtr0mtr.cc4
-rw-r--r--storage/innobase/srv/srv0start.cc3
-rw-r--r--storage/maria/ma_control_file.c6
21 files changed, 193 insertions, 189 deletions
diff --git a/mysql-test/main/query_cache_notembedded.result b/mysql-test/main/query_cache_notembedded.result
index 29a091b68c1..3477161e9cf 100644
--- a/mysql-test/main/query_cache_notembedded.result
+++ b/mysql-test/main/query_cache_notembedded.result
@@ -462,6 +462,27 @@ flush query cache|
delete from t1|
drop procedure bug3583|
drop table t1|
+#
+# MDEV-29760 DROP DATABASE hangs when particular query cache is present
+#
+create table t1 (id int);
+create table t2 like t1;
+create table t3 like t1;
+create database d;
+create table d.t1 like test.t1;
+create table d.t2 like test.t2;
+set LOCAL query_cache_type=ON;
+select id from t3;
+id
+select 'x' a, 'y' b from d.t1;
+a b
+select 'x' a, 'y' b from d.t1, d.t2;
+a b
+drop database d;
+drop table t1, t2, t3;
+#
+# End of 10.5 tests
+#
SET GLOBAL query_cache_size=@query_cache_size_save;
SET GLOBAL query_cache_type=@query_cache_type_save;
set GLOBAL sql_mode=@sql_mode_save;
diff --git a/mysql-test/main/query_cache_notembedded.test b/mysql-test/main/query_cache_notembedded.test
index 03c9d9e4cd4..83c7b1628e8 100644
--- a/mysql-test/main/query_cache_notembedded.test
+++ b/mysql-test/main/query_cache_notembedded.test
@@ -325,6 +325,33 @@ drop procedure bug3583|
drop table t1|
delimiter ;|
+--echo #
+--echo # MDEV-29760 DROP DATABASE hangs when particular query cache is present
+--echo #
+
+create table t1 (id int);
+create table t2 like t1;
+create table t3 like t1;
+
+create database d;
+
+create table d.t1 like test.t1;
+create table d.t2 like test.t2;
+
+set LOCAL query_cache_type=ON;
+
+select id from t3;
+select 'x' a, 'y' b from d.t1;
+select 'x' a, 'y' b from d.t1, d.t2;
+
+drop database d;
+
+drop table t1, t2, t3;
+
+--echo #
+--echo # End of 10.5 tests
+--echo #
+
# Wait till we reached the initial number of concurrent sessions
--source include/wait_until_count_sessions.inc
SET GLOBAL query_cache_size=@query_cache_size_save;
diff --git a/mysql-test/suite/binlog/r/binlog_checkpoint.result b/mysql-test/suite/binlog/r/binlog_checkpoint.result
index 7578a9fc6d9..a00b1c0c1a3 100644
--- a/mysql-test/suite/binlog/r/binlog_checkpoint.result
+++ b/mysql-test/suite/binlog/r/binlog_checkpoint.result
@@ -164,28 +164,9 @@ connection default;
SET GLOBAL debug_dbug="+d,only_kill_system_threads_no_loop";
# restart
** Proof of shutdown caused ROLLBACK-completed transaction
-include/show_binlog_events.inc
-Log_name Pos Event_type Server_id End_log_pos Info
-master-bin.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION
-master-bin.000002 # Gtid_list # # []
-master-bin.000002 # Binlog_checkpoint # # master-bin.000001
-master-bin.000002 # Binlog_checkpoint # # master-bin.000002
-master-bin.000002 # Gtid # # GTID #-#-#
-master-bin.000002 # Query # # use `test`; CREATE TABLE tm (a INT) ENGINE = myisam
-master-bin.000002 # Gtid # # BEGIN GTID #-#-#
-master-bin.000002 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'Table \'./test/tm\' is marked as crashed' COLLATE 'latin1_swedish_ci'))
-master-bin.000002 # Query # # COMMIT
-master-bin.000002 # Gtid # # BEGIN GTID #-#-#
-master-bin.000002 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'Checking table' COLLATE 'latin1_swedish_ci'))
-master-bin.000002 # Query # # COMMIT
-master-bin.000002 # Gtid # # BEGIN GTID #-#-#
-master-bin.000002 # Query # # use `test`; INSERT INTO tm SET a = 1
-master-bin.000002 # Query # # COMMIT
-master-bin.000002 # Gtid # # BEGIN GTID #-#-#
-master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (2, 1)
-master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES (3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
-master-bin.000002 # Query # # ROLLBACK
-master-bin.000002 # Rotate # # master-bin.000003;pos=POS
+# MYSQL_BINLOG datadir/binlog_file --result-file=assert_file
+include/assert_grep.inc [No XA statements should be written into the binary log]
+include/assert_grep.inc [The transaction should be rolled back]
SELECT * FROM tm;
a
1
diff --git a/mysql-test/suite/binlog/t/binlog_checkpoint.test b/mysql-test/suite/binlog/t/binlog_checkpoint.test
index 19b48ef68b0..4237f33c8af 100644
--- a/mysql-test/suite/binlog/t/binlog_checkpoint.test
+++ b/mysql-test/suite/binlog/t/binlog_checkpoint.test
@@ -212,7 +212,23 @@ XA END 'xa1';
--source include/start_mysqld.inc
--echo ** Proof of shutdown caused ROLLBACK-completed transaction
---source include/show_binlog_events.inc
+
+--let assert_file=$MYSQLTEST_VARDIR/tmp/binlog_decoded.out
+--let datadir=`select @@datadir`
+
+--echo # MYSQL_BINLOG datadir/binlog_file --result-file=assert_file
+--exec $MYSQL_BINLOG $datadir/$binlog_file --result-file=$assert_file
+
+--let $assert_text= No XA statements should be written into the binary log
+--let $assert_count= 0
+--let assert_select= XA START|XA END|XA PREPARE|XA COMMIT|XA ROLLBACK
+--source include/assert_grep.inc
+
+--let $assert_text= The transaction should be rolled back
+--let $assert_count= 1
+--let assert_select= ^ROLLBACK\$
+--source include/assert_grep.inc
+
SELECT * FROM tm;
--eval SELECT * FROM t1 WHERE a = $a
diff --git a/mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result b/mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result
index 3c3e4831d8a..bc8de59f6e4 100644
--- a/mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result
+++ b/mysql-test/suite/encryption/r/innodb_encrypt_log_corruption.result
@@ -190,6 +190,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
1
FOUND 4 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+# Empty large multi-file redo log from after MariaDB 10.2.2
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
+SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
+WHERE engine = 'innodb'
+AND support IN ('YES', 'DEFAULT', 'ENABLED');
+COUNT(*)
+1
+FOUND 5 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Minimal MariaDB 10.1.21 encrypted redo log
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb'
diff --git a/mysql-test/suite/innodb/r/log_corruption.result b/mysql-test/suite/innodb/r/log_corruption.result
index df58a90dcec..58a0e39e781 100644
--- a/mysql-test/suite/innodb/r/log_corruption.result
+++ b/mysql-test/suite/innodb/r/log_corruption.result
@@ -190,6 +190,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
COUNT(*)
1
FOUND 4 /InnoDB: Upgrading redo log:/ in mysqld.1.err
+# Empty large multi-file redo log from after MariaDB 10.2.2
+# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=4m
+SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
+WHERE engine = 'innodb'
+AND support IN ('YES', 'DEFAULT', 'ENABLED');
+COUNT(*)
+1
+FOUND 5 /InnoDB: Upgrading redo log:/ in mysqld.1.err
# Minimal MariaDB 10.1.21 encrypted redo log
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
SELECT * FROM INFORMATION_SCHEMA.ENGINES
diff --git a/mysql-test/suite/innodb/t/log_corruption.test b/mysql-test/suite/innodb/t/log_corruption.test
index dfbcadd9df5..04c3283c349 100644
--- a/mysql-test/suite/innodb/t/log_corruption.test
+++ b/mysql-test/suite/innodb/t/log_corruption.test
@@ -18,6 +18,7 @@ call mtr.add_suppression("InnoDB: Missing MLOG_FILE_NAME or MLOG_FILE_DELETE bef
call mtr.add_suppression("InnoDB: Obtaining redo log encryption key version 1 failed");
call mtr.add_suppression("InnoDB: Decrypting checkpoint failed");
call mtr.add_suppression("InnoDB: Log file .*ib_logfile1 is of different size 2097152 bytes than other log files (1048576|4194304) bytes!");
+call mtr.add_suppression("InnoDB: The change buffer is corrupted");
--enable_query_log
let bugdir= $MYSQLTEST_VARDIR/tmp/log_corruption;
@@ -606,6 +607,42 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
--let SEARCH_PATTERN= InnoDB: Upgrading redo log:
--source include/search_pattern_in_file.inc
+--echo # Empty large multi-file redo log from after MariaDB 10.2.2
+perl;
+do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
+my $polynomial = 0x82f63b78; # CRC-32C
+
+die unless open OUT, "+<", "$ENV{bugdir}/ib_logfile0";
+binmode OUT;
+$_= pack("Nx[5]nx[5]", 1, 0x1286) . "BogoDB 4.3.2.1" . chr(0) x 478;
+print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
+# checkpoint page 1 and all-zero checkpoint 2
+$_= pack("x[13]nCNNx[484]", 0x1286, 12, 2, 0x80c);
+print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
+print OUT chr(0) x 1024;
+die unless seek(OUT, 0x1FFFFFFFF, 0);
+print OUT chr(0);
+close OUT or die;
+die unless open OUT, ">", "$ENV{bugdir}/ib_logfile1";
+binmode OUT;
+die unless seek(OUT, 0x800, 0); # the first 2048 bytes are unused!
+$_= pack("Nnnx[500]", 0x80000944, 12, 12);
+print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
+die unless seek(OUT, 0x1FFFFFFFF, 0);
+print OUT chr(0);
+close OUT or die;
+EOF
+
+--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=4m
+--source include/start_mysqld.inc
+SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
+WHERE engine = 'innodb'
+AND support IN ('YES', 'DEFAULT', 'ENABLED');
+--source include/shutdown_mysqld.inc
+--let SEARCH_PATTERN= InnoDB: Upgrading redo log:
+--source include/search_pattern_in_file.inc
+--let $restart_parameters= $dirs
+
--echo # Minimal MariaDB 10.1.21 encrypted redo log
perl;
die unless open OUT, "+<", "$ENV{bugdir}/ib_logfile0";
diff --git a/plugin/password_reuse_check/CMakeLists.txt b/plugin/password_reuse_check/CMakeLists.txt
index b9175eb9f74..6c816071747 100644
--- a/plugin/password_reuse_check/CMakeLists.txt
+++ b/plugin/password_reuse_check/CMakeLists.txt
@@ -1,2 +1,3 @@
-MYSQL_ADD_PLUGIN(password_reuse_check password_reuse_check.c)
+MYSQL_ADD_PLUGIN(password_reuse_check password_reuse_check.c
+ RECOMPILE_FOR_EMBEDDED)
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 7eb48537705..530ab9c1ed2 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -9773,9 +9773,9 @@ ER_UNUSED_23
spa "Nunca debería vd de ver esto"
ER_PARTITION_WRONG_TYPE
- chi "错误的分区类型,预期类型:%`s for partitioning by %`s"
+ chi "错误分区类型%`s,应当是%`s"
eng "Wrong partition type %`s for partitioning by %`s"
- spa "Tipo de partición equivocada, tipo esperado: %`s for partitioning by %`s"
+ spa "Tipo de partición equivocada %`s para particionado mediante %`s"
WARN_VERS_PART_FULL
chi "版本化表%`s.%`s:partition%`s已满,添加更多历史分区(out of %s)"
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index 81ea002ce32..b284189db23 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -2131,8 +2131,7 @@ lookup:
("Handler require invalidation queries of %.*s %llu-%llu",
(int)qcache_se_key_len, qcache_se_key_name,
engine_data, table->engine_data()));
- invalidate_table_internal(thd,
- (uchar *) table->db(),
+ invalidate_table_internal((uchar *) table->db(),
table->key_length());
}
else
@@ -2381,7 +2380,7 @@ void Query_cache::invalidate(THD *thd, const char *db)
if (strcmp(table->db(),db) == 0)
{
Query_cache_block_table *list_root= table_block->table(0);
- invalidate_query_block_list(thd,list_root);
+ invalidate_query_block_list(list_root);
}
table_block= next;
@@ -3320,7 +3319,7 @@ void Query_cache::invalidate_table(THD *thd, uchar * key, size_t key_length)
DEBUG_SYNC(thd, "wait_in_query_cache_invalidate2");
if (query_cache_size > 0)
- invalidate_table_internal(thd, key, key_length);
+ invalidate_table_internal(key, key_length);
unlock();
}
@@ -3335,14 +3334,14 @@ void Query_cache::invalidate_table(THD *thd, uchar * key, size_t key_length)
*/
void
-Query_cache::invalidate_table_internal(THD *thd, uchar *key, size_t key_length)
+Query_cache::invalidate_table_internal(uchar *key, size_t key_length)
{
Query_cache_block *table_block=
(Query_cache_block*)my_hash_search(&tables, key, key_length);
if (table_block)
{
Query_cache_block_table *list_root= table_block->table(0);
- invalidate_query_block_list(thd, list_root);
+ invalidate_query_block_list(list_root);
}
}
@@ -3359,8 +3358,7 @@ Query_cache::invalidate_table_internal(THD *thd, uchar *key, size_t key_length)
*/
void
-Query_cache::invalidate_query_block_list(THD *thd,
- Query_cache_block_table *list_root)
+Query_cache::invalidate_query_block_list(Query_cache_block_table *list_root)
{
while (list_root->next != list_root)
{
@@ -3544,7 +3542,7 @@ Query_cache::insert_table(THD *thd, size_t key_len, const char *key,
*/
{
Query_cache_block_table *list_root= table_block->table(0);
- invalidate_query_block_list(thd, list_root);
+ invalidate_query_block_list(list_root);
}
table_block= 0;
diff --git a/sql/sql_cache.h b/sql/sql_cache.h
index 372d697015e..3c561b3bd15 100644
--- a/sql/sql_cache.h
+++ b/sql/sql_cache.h
@@ -319,7 +319,7 @@ private:
Cache_staus m_cache_status;
void free_query_internal(Query_cache_block *point);
- void invalidate_table_internal(THD *thd, uchar *key, size_t key_length);
+ void invalidate_table_internal(uchar *key, size_t key_length);
protected:
/*
@@ -375,8 +375,7 @@ protected:
void invalidate_table(THD *thd, TABLE *table);
void invalidate_table(THD *thd, uchar *key, size_t key_length);
void invalidate_table(THD *thd, Query_cache_block *table_block);
- void invalidate_query_block_list(THD *thd,
- Query_cache_block_table *list_root);
+ void invalidate_query_block_list(Query_cache_block_table *list_root);
TABLE_COUNTER_TYPE
register_tables_from_list(THD *thd, TABLE_LIST *tables_used,
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 096d13262ff..8a89e3089b7 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1830,13 +1830,16 @@ err:
}
error= thd->is_error();
+ if (non_temp_tables_count)
+ query_cache_invalidate3(thd, tables, 0);
+
/*
We are always logging drop of temporary tables.
The reason is to handle the following case:
- Use statement based replication
- CREATE TEMPORARY TABLE foo (logged)
- set row based replication
- - DROP TEMPORAY TABLE foo (needs to be logged)
+ - DROP TEMPORARY TABLE foo (needs to be logged)
This should be fixed so that we remember if creation of the
temporary table was logged and only log it if the creation was
logged.
@@ -1848,7 +1851,6 @@ err:
if (non_trans_tmp_table_deleted || trans_tmp_table_deleted)
thd->transaction->stmt.mark_dropped_temp_table();
- query_cache_invalidate3(thd, tables, 0);
if (!dont_log_query && mysql_bin_log.is_open())
{
debug_crash_here("ddl_log_drop_before_binlog");
diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc
index afc227169f3..63a28aa1a37 100644
--- a/storage/innobase/buf/buf0dump.cc
+++ b/storage/innobase/buf/buf0dump.cc
@@ -416,73 +416,6 @@ done:
}
/*****************************************************************//**
-Artificially delay the buffer pool loading if necessary. The idea of
-this function is to prevent hogging the server with IO and slowing down
-too much normal client queries. */
-UNIV_INLINE
-void
-buf_load_throttle_if_needed(
-/*========================*/
- ulint* last_check_time, /*!< in/out: milliseconds since epoch
- of the last time we did check if
- throttling is needed, we do the check
- every srv_io_capacity IO ops. */
- ulint* last_activity_count,
- ulint n_io) /*!< in: number of IO ops done since
- buffer pool load has started */
-{
- if (n_io % srv_io_capacity < srv_io_capacity - 1) {
- return;
- }
-
- if (*last_check_time == 0 || *last_activity_count == 0) {
- *last_check_time = ut_time_ms();
- *last_activity_count = srv_get_activity_count();
- return;
- }
-
- /* srv_io_capacity IO operations have been performed by buffer pool
- load since the last time we were here. */
-
- /* If no other activity, then keep going without any delay. */
- if (srv_get_activity_count() == *last_activity_count) {
- return;
- }
-
- /* There has been other activity, throttle. */
-
- ulint now = ut_time_ms();
- ulint elapsed_time = now - *last_check_time;
-
- /* Notice that elapsed_time is not the time for the last
- srv_io_capacity IO operations performed by BP load. It is the
- time elapsed since the last time we detected that there has been
- other activity. This has a small and acceptable deficiency, e.g.:
- 1. BP load runs and there is no other activity.
- 2. Other activity occurs, we run N IO operations after that and
- enter here (where 0 <= N < srv_io_capacity).
- 3. last_check_time is very old and we do not sleep at this time, but
- only update last_check_time and last_activity_count.
- 4. We run srv_io_capacity more IO operations and call this function
- again.
- 5. There has been more other activity and thus we enter here.
- 6. Now last_check_time is recent and we sleep if necessary to prevent
- more than srv_io_capacity IO operations per second.
- The deficiency is that we could have slept at 3., but for this we
- would have to update last_check_time before the
- "cur_activity_count == *last_activity_count" check and calling
- ut_time_ms() that often may turn out to be too expensive. */
-
- if (elapsed_time < 1000 /* 1 sec (1000 milli secs) */) {
- std::this_thread::sleep_for(
- std::chrono::milliseconds(1000 - elapsed_time));
- }
-
- *last_check_time = ut_time_ms();
- *last_activity_count = srv_get_activity_count();
-}
-
-/*****************************************************************//**
Perform a buffer pool load from the file specified by
innodb_buffer_pool_filename. If any errors occur then the value of
innodb_buffer_pool_load_status will be set accordingly, see buf_load_status().
@@ -631,9 +564,6 @@ buf_load()
std::sort(dump, dump + dump_n);
}
- ulint last_check_time = 0;
- ulint last_activity_cnt = 0;
-
/* Avoid calling the expensive fil_space_t::get() for each
page within the same tablespace. dump[] is sorted by (space, page),
so all pages from a given tablespace are consecutive. */
@@ -707,9 +637,6 @@ buf_load()
return;
}
- buf_load_throttle_if_needed(
- &last_check_time, &last_activity_cnt, i);
-
#ifdef UNIV_DEBUG
if ((i+1) >= srv_buf_pool_load_pages_abort) {
buf_load_abort_flag = true;
diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc
index 33264bc88a1..23e870e528b 100644
--- a/storage/innobase/buf/buf0lru.cc
+++ b/storage/innobase/buf/buf0lru.cc
@@ -190,8 +190,6 @@ LRU list. The compressed page is preserved, and it need not be clean.
@return true if freed */
static bool buf_LRU_free_from_unzip_LRU_list(ulint limit)
{
- mysql_mutex_assert_owner(&buf_pool.mutex);
-
if (!buf_LRU_evict_from_unzip_LRU()) {
return(false);
}
@@ -210,6 +208,7 @@ static bool buf_LRU_free_from_unzip_LRU_list(ulint limit)
freed = buf_LRU_free_page(&block->page, false);
if (freed) {
+ scanned++;
break;
}
@@ -254,17 +253,16 @@ static bool buf_LRU_free_from_common_LRU_list(ulint limit)
}
freed = true;
+ scanned++;
break;
}
}
- if (scanned) {
- MONITOR_INC_VALUE_CUMULATIVE(
- MONITOR_LRU_SEARCH_SCANNED,
- MONITOR_LRU_SEARCH_SCANNED_NUM_CALL,
- MONITOR_LRU_SEARCH_SCANNED_PER_CALL,
- scanned);
- }
+ MONITOR_INC_VALUE_CUMULATIVE(
+ MONITOR_LRU_SEARCH_SCANNED,
+ MONITOR_LRU_SEARCH_SCANNED_NUM_CALL,
+ MONITOR_LRU_SEARCH_SCANNED_PER_CALL,
+ scanned);
return(freed);
}
diff --git a/storage/innobase/dict/dict0boot.cc b/storage/innobase/dict/dict0boot.cc
index 53cbde11328..5516bce920b 100644
--- a/storage/innobase/dict/dict0boot.cc
+++ b/storage/innobase/dict/dict0boot.cc
@@ -297,9 +297,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "NAME", 0);
index->id = DICT_TABLES_ID;
- dberr_t error = dict_index_add_to_cache(
+ err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_TABLES));
- ut_a(error == DB_SUCCESS);
+ ut_a(err == DB_SUCCESS);
ut_ad(!table->is_instant());
table->indexes.start->n_core_null_bytes = static_cast<uint8_t>(
UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable)));
@@ -309,9 +309,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "ID", 0);
index->id = DICT_TABLE_IDS_ID;
- error = dict_index_add_to_cache(
+ err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_TABLE_IDS));
- ut_a(error == DB_SUCCESS);
+ ut_a(err == DB_SUCCESS);
/*-------------------------*/
table = dict_table_t::create(dict_sys.SYS_TABLE[dict_sys.SYS_COLUMNS],
@@ -339,9 +339,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "POS", 0);
index->id = DICT_COLUMNS_ID;
- error = dict_index_add_to_cache(
+ err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_COLUMNS));
- ut_a(error == DB_SUCCESS);
+ ut_a(err == DB_SUCCESS);
ut_ad(!table->is_instant());
table->indexes.start->n_core_null_bytes = static_cast<uint8_t>(
UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable)));
@@ -382,9 +382,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "ID", 0);
index->id = DICT_INDEXES_ID;
- error = dict_index_add_to_cache(
+ err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_INDEXES));
- ut_a(error == DB_SUCCESS);
+ ut_a(err == DB_SUCCESS);
ut_ad(!table->is_instant());
table->indexes.start->n_core_null_bytes = static_cast<uint8_t>(
UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable)));
@@ -411,9 +411,9 @@ dberr_t dict_boot()
dict_mem_index_add_field(index, "POS", 0);
index->id = DICT_FIELDS_ID;
- error = dict_index_add_to_cache(
+ err = dict_index_add_to_cache(
index, mach_read_from_4(dict_hdr + DICT_HDR_FIELDS));
- ut_a(error == DB_SUCCESS);
+ ut_a(err == DB_SUCCESS);
ut_ad(!table->is_instant());
table->indexes.start->n_core_null_bytes = static_cast<uint8_t>(
UT_BITS_IN_BYTES(unsigned(table->indexes.start->n_nullable)));
@@ -422,7 +422,8 @@ dberr_t dict_boot()
err = ibuf_init_at_db_start();
- if (err == DB_SUCCESS) {
+ if (err == DB_SUCCESS || srv_force_recovery >= SRV_FORCE_NO_DDL_UNDO) {
+ err = DB_SUCCESS;
/* Load definitions of other indexes on system tables */
dict_load_sys_table(dict_sys.sys_tables);
diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc
index 90d61a40eb7..c50e58e6036 100644
--- a/storage/innobase/ibuf/ibuf0ibuf.cc
+++ b/storage/innobase/ibuf/ibuf0ibuf.cc
@@ -49,6 +49,7 @@ Created 7/19/1997 Heikki Tuuri
#include "que0que.h"
#include "srv0start.h" /* srv_shutdown_state */
#include "rem0cmp.h"
+#include "log.h"
/* STRUCTURE OF AN INSERT BUFFER RECORD
@@ -402,24 +403,11 @@ ibuf_init_at_db_start(void)
if (!header_page) {
err_exit:
+ sql_print_error("InnoDB: The change buffer is corrupted");
mtr.commit();
return err;
}
- /* At startup we intialize ibuf to have a maximum of
- CHANGE_BUFFER_DEFAULT_SIZE in terms of percentage of the
- buffer pool size. Once ibuf struct is initialized this
- value is updated with the user supplied size by calling
- ibuf_max_size_update(). */
- ibuf.max_size = ((buf_pool_get_curr_size() >> srv_page_size_shift)
- * CHANGE_BUFFER_DEFAULT_SIZE) / 100;
-
- mysql_mutex_init(ibuf_mutex_key, &ibuf_mutex, nullptr);
- mysql_mutex_init(ibuf_pessimistic_insert_mutex_key,
- &ibuf_pessimistic_insert_mutex, nullptr);
-
- mysql_mutex_lock(&ibuf_mutex);
-
fseg_n_reserved_pages(*header_page,
IBUF_HEADER + IBUF_TREE_SEG_HEADER
+ header_page->page.frame, &ibuf.seg_size, &mtr);
@@ -438,6 +426,25 @@ err_exit:
goto err_exit;
}
+ if (page_is_comp(root) || fil_page_get_type(root) != FIL_PAGE_INDEX
+ || btr_page_get_index_id(root) != DICT_IBUF_ID_MIN) {
+ err = DB_CORRUPTION;
+ goto err_exit;
+ }
+
+ /* At startup we intialize ibuf to have a maximum of
+ CHANGE_BUFFER_DEFAULT_SIZE in terms of percentage of the
+ buffer pool size. Once ibuf struct is initialized this
+ value is updated with the user supplied size by calling
+ ibuf_max_size_update(). */
+ ibuf.max_size = ((buf_pool_get_curr_size() >> srv_page_size_shift)
+ * CHANGE_BUFFER_DEFAULT_SIZE) / 100;
+
+ mysql_mutex_init(ibuf_mutex_key, &ibuf_mutex, nullptr);
+ mysql_mutex_init(ibuf_pessimistic_insert_mutex_key,
+ &ibuf_pessimistic_insert_mutex, nullptr);
+
+ mysql_mutex_lock(&ibuf_mutex);
ibuf_size_update(root);
mysql_mutex_unlock(&ibuf_mutex);
@@ -487,6 +494,7 @@ ibuf_max_size_update(
ulint new_val) /*!< in: new value in terms of
percentage of the buffer pool size */
{
+ if (UNIV_UNLIKELY(!ibuf.index)) return;
ulint new_size = ((buf_pool_get_curr_size() >> srv_page_size_shift)
* new_val) / 100;
mysql_mutex_lock(&ibuf_mutex);
diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i
index 373c97e5078..d06343fcabe 100644
--- a/storage/innobase/include/univ.i
+++ b/storage/innobase/include/univ.i
@@ -82,15 +82,6 @@ HAVE_PSI_INTERFACE is defined. */
# define UNIV_PFS_MEMORY
# endif /* HAVE_PSI_MEMORY_INTERFACE */
-/* There are mutexes/rwlocks that we want to exclude from
-instrumentation even if their corresponding performance schema
-define is set. And this PFS_NOT_INSTRUMENTED is used
-as the key value to identify those objects that would
-be excluded from instrumentation. */
-# define PFS_NOT_INSTRUMENTED ULINT32_UNDEFINED
-
-# define PFS_IS_INSTRUMENTED(key) ((key) != PFS_NOT_INSTRUMENTED)
-
#ifdef HAVE_PFS_THREAD_PROVIDER_H
/* For PSI_MUTEX_CALL() and similar. */
#include "pfs_thread_provider.h"
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc
index d2419a81761..1bd24ac8bc9 100644
--- a/storage/innobase/log/log0recv.cc
+++ b/storage/innobase/log/log0recv.cc
@@ -651,22 +651,12 @@ static struct
{
/* Replace absolute DATA DIRECTORY file paths with
short names relative to the backup directory. */
- const char *name= strrchr(filename, '/');
-#ifdef _WIN32
- if (const char *last= strrchr(filename, '\\'))
- if (last > name)
- name= last;
-#endif
- if (name)
+ if (const char *name= strrchr(filename, '/'))
{
- while (--name > filename &&
-#ifdef _WIN32
- *name != '\\' &&
-#endif
- *name != '/');
+ while (--name > filename && *name != '/');
if (name > filename)
filename= name + 1;
- }
+ }
}
char *fil_path= fil_make_filepath(nullptr, {filename, strlen(filename)},
@@ -832,21 +822,9 @@ processed:
const char *filename= name.c_str();
if (srv_operation == SRV_OPERATION_RESTORE)
{
- const char* tbl_name = strrchr(filename, '/');
-#ifdef _WIN32
- if (const char *last = strrchr(filename, '\\'))
+ if (const char *tbl_name= strrchr(filename, '/'))
{
- if (last > tbl_name)
- tbl_name = last;
- }
-#endif
- if (tbl_name)
- {
- while (--tbl_name > filename &&
-#ifdef _WIN32
- *tbl_name != '\\' &&
-#endif
- *tbl_name != '/');
+ while (--tbl_name > filename && *tbl_name != '/');
if (tbl_name > filename)
filename= tbl_name + 1;
}
@@ -1671,7 +1649,7 @@ static dberr_t recv_log_recover_10_5(lsn_t lsn_offset)
if (lsn_offset < (log_sys.is_pmem() ? log_sys.file_size : 4096))
memcpy_aligned<512>(buf, &log_sys.buf[lsn_offset & ~511], 512);
else
- recv_sys.read(lsn_offset & ~511, {buf, 512});
+ recv_sys.read(lsn_offset & ~lsn_t{511}, {buf, 512});
if (!recv_check_log_block(buf))
{
diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc
index 6ee4409902b..d2569517c49 100644
--- a/storage/innobase/mtr/mtr0mtr.cc
+++ b/storage/innobase/mtr/mtr0mtr.cc
@@ -1287,14 +1287,14 @@ bool mtr_t::have_x_latch(const buf_block_t &block) const
if (!m_memo)
return false;
- const mtr_memo_slot_t *found= nullptr;
+ ut_d(const mtr_memo_slot_t *found= nullptr);
for (const mtr_memo_slot_t &slot : *m_memo)
{
if (slot.object != &block)
continue;
- found= &slot;
+ ut_d(found= &slot);
if (!(slot.type & MTR_MEMO_PAGE_X_FIX))
continue;
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index 4954a07c64e..ee85daf88e1 100644
--- a/storage/innobase/srv/srv0start.cc
+++ b/storage/innobase/srv/srv0start.cc
@@ -1730,7 +1730,8 @@ void innodb_shutdown()
|| srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO);
ut_ad(lock_sys.is_initialised() || !srv_was_started);
ut_ad(log_sys.is_initialised() || !srv_was_started);
- ut_ad(ibuf.index || !srv_was_started);
+ ut_ad(ibuf.index || !srv_was_started
+ || srv_force_recovery >= SRV_FORCE_NO_DDL_UNDO);
dict_stats_deinit();
diff --git a/storage/maria/ma_control_file.c b/storage/maria/ma_control_file.c
index bcf9a7041e4..21befb70bd9 100644
--- a/storage/maria/ma_control_file.c
+++ b/storage/maria/ma_control_file.c
@@ -640,7 +640,7 @@ my_bool print_aria_log_control()
open_flags, MYF(MY_WME))) < 0)
{
errmsg= "Can't open file";
- goto err;
+ goto err2;
}
file_size= mysql_file_seek(file, 0, SEEK_END, MYF(MY_WME));
@@ -723,10 +723,12 @@ my_bool print_aria_log_control()
(buffer + new_cf_create_time_size + CF_RECOV_FAIL_OFFSET)[0];
printf("recovery_failures: %u\n", recovery_fails);
}
-
+ mysql_file_close(file, MYF(0));
DBUG_RETURN(0);
err:
+ mysql_file_close(file, MYF(0));
+err2:
my_printf_error(HA_ERR_INITIALIZATION,
"Got error '%s' when trying to use aria control file "
"'%s'", 0, errmsg, name);