Commit bcd16075 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.2 into 10.3

parents e9b8b76f 545cba13
...@@ -4665,12 +4665,11 @@ static bool xtrabackup_backup_func() ...@@ -4665,12 +4665,11 @@ static bool xtrabackup_backup_func()
log_file_op = NULL; log_file_op = NULL;
pthread_mutex_destroy(&backup_mutex); pthread_mutex_destroy(&backup_mutex);
pthread_cond_destroy(&scanned_lsn_cond); pthread_cond_destroy(&scanned_lsn_cond);
if (opt_log_innodb_page_corruption && !corrupted_pages.empty()) { if (!corrupted_pages.empty()) {
ut_ad(opt_log_innodb_page_corruption);
msg("Error: corrupted innodb pages are found and logged to " msg("Error: corrupted innodb pages are found and logged to "
MB_CORRUPTED_PAGES_FILE " file"); MB_CORRUPTED_PAGES_FILE " file");
return false;
} }
else
return(true); return(true);
} }
......
...@@ -25,8 +25,9 @@ INSERT INTO t7_corrupted_to_alter VALUES (3), (4), (5), (6), (7), (8), (9); ...@@ -25,8 +25,9 @@ INSERT INTO t7_corrupted_to_alter VALUES (3), (4), (5), (6), (7), (8), (9);
# Backup must fail due to page corruption # Backup must fail due to page corruption
FOUND 1 /Database page corruption detected.*/ in backup.log FOUND 1 /Database page corruption detected.*/ in backup.log
# "innodb_corrupted_pages" file must not exist # "innodb_corrupted_pages" file must not exist
# Backup must fail, but "innodb_corrupted_pages" file must be created due to --log-innodb-page-corruption option # Backup must not fail, but "innodb_corrupted_pages" file must be created due to --log-innodb-page-corruption option
FOUND 1 /Database page corruption detected.*/ in backup.log FOUND 1 /Database page corruption detected.*/ in backup.log
FOUND 1 /completed OK!/ in backup.log
--- "innodb_corrupted_pages" file content: --- --- "innodb_corrupted_pages" file content: ---
test/t1_corrupted test/t1_corrupted
6 8 9 6 8 9
...@@ -42,7 +43,7 @@ test/t7_corrupted_to_alter ...@@ -42,7 +43,7 @@ test/t7_corrupted_to_alter
INSERT INTO t1_inc_corrupted VALUES (3), (4), (5), (6), (7), (8), (9); INSERT INTO t1_inc_corrupted VALUES (3), (4), (5), (6), (7), (8), (9);
INSERT INTO t2_inc_corrupted VALUES (3), (4), (5), (6), (7), (8), (9); INSERT INTO t2_inc_corrupted VALUES (3), (4), (5), (6), (7), (8), (9);
INSERT INTO t3_inc VALUES (3), (4), (5), (6), (7), (8), (9); INSERT INTO t3_inc VALUES (3), (4), (5), (6), (7), (8), (9);
# Backup must fail, but "innodb_corrupted_pages" file must be created due to --log-innodb-page-corruption option # Backup must not fail, but "innodb_corrupted_pages" file must be created due to --log-innodb-page-corruption option
--- "innodb_corrupted_pages" file content: --- --- "innodb_corrupted_pages" file content: ---
test/t1_corrupted test/t1_corrupted
6 8 9 6 8 9
......
...@@ -80,15 +80,19 @@ exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir= ...@@ -80,15 +80,19 @@ exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=
--let after_copy_test_t7_corrupted_to_alter=ALTER TABLE test.t7_corrupted_to_alter ADD COLUMN (d INT) --let after_copy_test_t7_corrupted_to_alter=ALTER TABLE test.t7_corrupted_to_alter ADD COLUMN (d INT)
--let add_corrupted_page_for_test_t7_corrupted_to_alter=3 --let add_corrupted_page_for_test_t7_corrupted_to_alter=3
--echo # Backup must fail, but "innodb_corrupted_pages" file must be created due to --log-innodb-page-corruption option --echo # Backup must not fail, but "innodb_corrupted_pages" file must be created due to --log-innodb-page-corruption option
--disable_result_log --disable_result_log
--error 1
--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --log-innodb-page-corruption --target-dir=$targetdir --dbug=+d,mariabackup_events,mariabackup_inject_code > $backuplog --exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --log-innodb-page-corruption --target-dir=$targetdir --dbug=+d,mariabackup_events,mariabackup_inject_code > $backuplog
--enable_result_log --enable_result_log
--let SEARCH_PATTERN=Database page corruption detected.* --let SEARCH_PATTERN=Database page corruption detected.*
--let SEARCH_FILE=$backuplog --let SEARCH_FILE=$backuplog
--source include/search_pattern_in_file.inc --source include/search_pattern_in_file.inc
--let SEARCH_PATTERN=completed OK!
--let SEARCH_FILE=$backuplog
--source include/search_pattern_in_file.inc
--echo --- "innodb_corrupted_pages" file content: --- --echo --- "innodb_corrupted_pages" file content: ---
perl; perl;
do "$ENV{MTR_SUITE_DIR}/include/corrupt-page.pl"; do "$ENV{MTR_SUITE_DIR}/include/corrupt-page.pl";
...@@ -145,9 +149,8 @@ EOF ...@@ -145,9 +149,8 @@ EOF
--let after_copy_test_t7_inc_corrupted_to_alter=ALTER TABLE test.t7_inc_corrupted_to_alter ADD COLUMN (d INT) --let after_copy_test_t7_inc_corrupted_to_alter=ALTER TABLE test.t7_inc_corrupted_to_alter ADD COLUMN (d INT)
--let add_corrupted_page_for_test_t7_inc_corrupted_to_alter=3 --let add_corrupted_page_for_test_t7_inc_corrupted_to_alter=3
--echo # Backup must fail, but "innodb_corrupted_pages" file must be created due to --log-innodb-page-corruption option --echo # Backup must not fail, but "innodb_corrupted_pages" file must be created due to --log-innodb-page-corruption option
--disable_result_log --disable_result_log
--error 1
--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --log-innodb-page-corruption --target-dir=$incdir --incremental-basedir=$targetdir --dbug=+d,mariabackup_events,mariabackup_inject_code > $backuplog --exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --log-innodb-page-corruption --target-dir=$incdir --incremental-basedir=$targetdir --dbug=+d,mariabackup_events,mariabackup_inject_code > $backuplog
--disable_result_log --disable_result_log
...@@ -161,6 +164,9 @@ EOF ...@@ -161,6 +164,9 @@ EOF
--let SEARCH_PATTERN=Database page corruption detected.* --let SEARCH_PATTERN=Database page corruption detected.*
--let SEARCH_FILE=$backuplog --let SEARCH_FILE=$backuplog
--source include/search_pattern_in_file.inc --source include/search_pattern_in_file.inc
--let SEARCH_PATTERN=completed OK!
--source include/search_pattern_in_file.inc
--let corrupted_pages_file = $incdir/innodb_corrupted_pages --let corrupted_pages_file = $incdir/innodb_corrupted_pages
--echo --- "innodb_corrupted_pages" file content: --- --echo --- "innodb_corrupted_pages" file content: ---
perl; perl;
...@@ -260,7 +266,6 @@ EOF ...@@ -260,7 +266,6 @@ EOF
--echo # Full backup with --log-innodb-page-corruption --echo # Full backup with --log-innodb-page-corruption
--disable_result_log --disable_result_log
--error 1
--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --log-innodb-page-corruption --target-dir=$targetdir --exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --log-innodb-page-corruption --target-dir=$targetdir
--enable_result_log --enable_result_log
--let corrupted_pages_file = $targetdir/innodb_corrupted_pages --let corrupted_pages_file = $targetdir/innodb_corrupted_pages
...@@ -288,7 +293,6 @@ EOF ...@@ -288,7 +293,6 @@ EOF
--echo # Incremental backup --log-innodb-page-corruption --echo # Incremental backup --log-innodb-page-corruption
--disable_result_log --disable_result_log
--error 1
--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --log-innodb-page-corruption --target-dir=$incdir --incremental-basedir=$targetdir --dbug=+d,mariabackup_events,mariabackup_inject_code > $backuplog --exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --log-innodb-page-corruption --target-dir=$incdir --incremental-basedir=$targetdir --dbug=+d,mariabackup_events,mariabackup_inject_code > $backuplog
--disable_result_log --disable_result_log
--let corrupted_pages_file = $incdir/innodb_corrupted_pages --let corrupted_pages_file = $incdir/innodb_corrupted_pages
......
...@@ -13326,17 +13326,10 @@ innobase_drop_database( ...@@ -13326,17 +13326,10 @@ innobase_drop_database(
@param[in,out] trx InnoDB data dictionary transaction @param[in,out] trx InnoDB data dictionary transaction
@param[in] from old table name @param[in] from old table name
@param[in] to new table name @param[in] to new table name
@param[in] commit whether to commit trx @param[in] commit whether to commit trx (and to enforce FOREIGN KEY)
@param[in] use_fk whether to parse and enforce FOREIGN KEY constraints
@return DB_SUCCESS or error code */ @return DB_SUCCESS or error code */
inline inline dberr_t innobase_rename_table(trx_t *trx, const char *from,
dberr_t const char *to, bool commit)
innobase_rename_table(
trx_t* trx,
const char* from,
const char* to,
bool commit,
bool use_fk)
{ {
dberr_t error; dberr_t error;
char norm_to[FN_REFLEN]; char norm_to[FN_REFLEN];
...@@ -13369,6 +13362,9 @@ innobase_rename_table( ...@@ -13369,6 +13362,9 @@ innobase_rename_table(
Convert lock_wait_timeout unit from second to 250 milliseconds */ Convert lock_wait_timeout unit from second to 250 milliseconds */
long int lock_wait_timeout = thd_lock_wait_timeout(trx->mysql_thd) * 4; long int lock_wait_timeout = thd_lock_wait_timeout(trx->mysql_thd) * 4;
if (table != NULL) { if (table != NULL) {
if (commit) {
dict_stats_wait_bg_to_stop_using_table(table, trx);
}
for (dict_index_t* index = dict_table_get_first_index(table); for (dict_index_t* index = dict_table_get_first_index(table);
index != NULL; index != NULL;
index = dict_table_get_next_index(index)) { index = dict_table_get_next_index(index)) {
...@@ -13382,8 +13378,10 @@ innobase_rename_table( ...@@ -13382,8 +13378,10 @@ innobase_rename_table(
} }
} }
} }
if (!commit) {
dict_table_close(table, TRUE, FALSE); dict_table_close(table, TRUE, FALSE);
} }
}
/* FTS sync is in progress. We shall timeout this operation */ /* FTS sync is in progress. We shall timeout this operation */
if (lock_wait_timeout < 0) { if (lock_wait_timeout < 0) {
...@@ -13392,7 +13390,7 @@ innobase_rename_table( ...@@ -13392,7 +13390,7 @@ innobase_rename_table(
} }
error = row_rename_table_for_mysql(norm_from, norm_to, trx, commit, error = row_rename_table_for_mysql(norm_from, norm_to, trx, commit,
use_fk); commit);
if (error != DB_SUCCESS) { if (error != DB_SUCCESS) {
if (error == DB_TABLE_NOT_FOUND if (error == DB_TABLE_NOT_FOUND
...@@ -13444,6 +13442,10 @@ innobase_rename_table( ...@@ -13444,6 +13442,10 @@ innobase_rename_table(
func_exit: func_exit:
if (commit) { if (commit) {
if (table) {
table->stats_bg_flag &= ~BG_STAT_SHOULD_QUIT;
dict_table_close(table, TRUE, FALSE);
}
row_mysql_unlock_data_dictionary(trx); row_mysql_unlock_data_dictionary(trx);
} }
...@@ -13498,9 +13500,11 @@ int ha_innobase::truncate() ...@@ -13498,9 +13500,11 @@ int ha_innobase::truncate()
++trx->will_lock; ++trx->will_lock;
trx_set_dict_operation(trx, TRX_DICT_OP_TABLE); trx_set_dict_operation(trx, TRX_DICT_OP_TABLE);
row_mysql_lock_data_dictionary(trx); row_mysql_lock_data_dictionary(trx);
dict_stats_wait_bg_to_stop_using_table(ib_table, trx);
int err = convert_error_code_to_mysql( int err = convert_error_code_to_mysql(
innobase_rename_table(trx, ib_table->name.m_name, temp_name, innobase_rename_table(trx, ib_table->name.m_name, temp_name,
false, false), false),
ib_table->flags, m_user_thd); ib_table->flags, m_user_thd);
if (err) { if (err) {
trx_rollback_for_mysql(trx); trx_rollback_for_mysql(trx);
...@@ -13583,7 +13587,7 @@ ha_innobase::rename_table( ...@@ -13583,7 +13587,7 @@ ha_innobase::rename_table(
++trx->will_lock; ++trx->will_lock;
trx_set_dict_operation(trx, TRX_DICT_OP_INDEX); trx_set_dict_operation(trx, TRX_DICT_OP_INDEX);
dberr_t error = innobase_rename_table(trx, from, to, true, true); dberr_t error = innobase_rename_table(trx, from, to, true);
DEBUG_SYNC(thd, "after_innobase_rename_table"); DEBUG_SYNC(thd, "after_innobase_rename_table");
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2019, MariaDB Corporation. Copyright (c) 2017, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -799,12 +799,6 @@ struct row_prebuilt_t { ...@@ -799,12 +799,6 @@ struct row_prebuilt_t {
search key values from MySQL format search key values from MySQL format
to InnoDB format.*/ to InnoDB format.*/
uint srch_key_val_len; /*!< Size of search key */ uint srch_key_val_len; /*!< Size of search key */
/** Disable prefetch. */
bool m_no_prefetch;
/** Return materialized key for secondary index scan */
bool m_read_virtual_key;
/** The MySQL table object */ /** The MySQL table object */
TABLE* m_mysql_table; TABLE* m_mysql_table;
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2000, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 2020, MariaDB Corporation. Copyright (c) 2015, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
...@@ -963,9 +963,6 @@ row_create_prebuilt( ...@@ -963,9 +963,6 @@ row_create_prebuilt(
prebuilt->fts_doc_id_in_read_set = 0; prebuilt->fts_doc_id_in_read_set = 0;
prebuilt->blob_heap = NULL; prebuilt->blob_heap = NULL;
prebuilt->m_no_prefetch = false;
prebuilt->m_read_virtual_key = false;
DBUG_RETURN(prebuilt); DBUG_RETURN(prebuilt);
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc. Copyright (c) 2008, Google Inc.
Copyright (c) 2015, 2020, MariaDB Corporation. Copyright (c) 2015, 2021, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described Google, Inc. Those modifications are gratefully acknowledged and are described
...@@ -3081,8 +3081,7 @@ static bool row_sel_store_mysql_rec( ...@@ -3081,8 +3081,7 @@ static bool row_sel_store_mysql_rec(
search or virtual key read is not requested. */ search or virtual key read is not requested. */
if (!rec_clust if (!rec_clust
|| !prebuilt->index->has_virtual() || !prebuilt->index->has_virtual()
|| (!prebuilt->read_just_key || !prebuilt->read_just_key) {
&& !prebuilt->m_read_virtual_key)) {
/* Initialize the NULL bit. */ /* Initialize the NULL bit. */
mysql_rec[templ->mysql_null_byte_offset] mysql_rec[templ->mysql_null_byte_offset]
|= (byte) templ->mysql_null_bit_mask; |= (byte) templ->mysql_null_bit_mask;
...@@ -3098,23 +3097,8 @@ static bool row_sel_store_mysql_rec( ...@@ -3098,23 +3097,8 @@ static bool row_sel_store_mysql_rec(
const dfield_t* dfield = dtuple_get_nth_v_field( const dfield_t* dfield = dtuple_get_nth_v_field(
vrow, col->v_pos); vrow, col->v_pos);
/* If this is a partitioned table, it might request
InnoDB to fill out virtual column data for serach
index key values while other non key columns are also
getting selected. The non-key virtual columns may
not be materialized and we should skip them. */
if (dfield_get_type(dfield)->mtype == DATA_MISSING) { if (dfield_get_type(dfield)->mtype == DATA_MISSING) {
#ifdef UNIV_DEBUG ut_ad("no ha_innopart in MariaDB" == 0);
ulint prefix;
#endif /* UNIV_DEBUG */
ut_ad(prebuilt->m_read_virtual_key);
/* If it is part of index key the data should
have been materialized. */
ut_ad(dict_index_get_nth_col_or_prefix_pos(
prebuilt->index, col->v_pos, false,
true, &prefix) == ULINT_UNDEFINED);
continue; continue;
} }
...@@ -4298,8 +4282,7 @@ row_search_mvcc( ...@@ -4298,8 +4282,7 @@ row_search_mvcc(
index key, if this is covered index scan or virtual key read is index key, if this is covered index scan or virtual key read is
requested. */ requested. */
bool need_vrow = dict_index_has_virtual(prebuilt->index) bool need_vrow = dict_index_has_virtual(prebuilt->index)
&& (prebuilt->read_just_key && prebuilt->read_just_key;
|| prebuilt->m_read_virtual_key);
/* Reset the new record lock info if srv_locks_unsafe_for_binlog /* Reset the new record lock info if srv_locks_unsafe_for_binlog
is set or session is using a READ COMMITTED isolation level. Then is set or session is using a READ COMMITTED isolation level. Then
...@@ -5437,7 +5420,6 @@ row_search_mvcc( ...@@ -5437,7 +5420,6 @@ row_search_mvcc(
if ((match_mode == ROW_SEL_EXACT if ((match_mode == ROW_SEL_EXACT
|| prebuilt->n_rows_fetched >= MYSQL_FETCH_CACHE_THRESHOLD) || prebuilt->n_rows_fetched >= MYSQL_FETCH_CACHE_THRESHOLD)
&& prebuilt->select_lock_type == LOCK_NONE && prebuilt->select_lock_type == LOCK_NONE
&& !prebuilt->m_no_prefetch
&& !prebuilt->templ_contains_blob && !prebuilt->templ_contains_blob
&& !prebuilt->clust_index_was_generated && !prebuilt->clust_index_was_generated
&& !prebuilt->used_in_HANDLER && !prebuilt->used_in_HANDLER
......
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