diff options
| author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-05-12 08:11:57 +0300 |
|---|---|---|
| committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-05-12 08:11:57 +0300 |
| commit | daa2680c78d155868c5d0d14345669ecea13069b (patch) | |
| tree | 666e9f06f6eb8a05804cea63020c99b62d1bee57 | |
| parent | 7da0f30ccc5446cf6c30289e51d461b7f0595891 (diff) | |
| parent | 3fabdc3ca889db0e490df3a9a48ae527f21eed45 (diff) | |
| download | mariadb-git-daa2680c78d155868c5d0d14345669ecea13069b.tar.gz | |
Merge 10.5 into 10.6
| -rw-r--r-- | extra/mariabackup/xtrabackup.cc | 39 | ||||
| -rw-r--r-- | mysql-test/suite/mariabackup/incremental_backup.test | 16 | ||||
| -rw-r--r-- | sql/item.h | 4 | ||||
| -rw-r--r-- | storage/innobase/buf/buf0buf.cc | 16 |
4 files changed, 48 insertions, 27 deletions
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index a22e996200a..512c8d21267 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -51,6 +51,7 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #include <my_getopt.h> #include <mysql_com.h> #include <my_default.h> +#include <scope.h> #include <sql_class.h> #include <fcntl.h> @@ -4601,13 +4602,6 @@ fail: } - if (auto b = aligned_malloc(UNIV_PAGE_SIZE_MAX, 4096)) { - field_ref_zero = static_cast<byte*>( - memset_aligned<4096>(b, 0, UNIV_PAGE_SIZE_MAX)); - } else { - goto fail; - } - { /* definition from recv_recovery_from_checkpoint_start() */ ulint max_cp_field; @@ -4624,10 +4618,6 @@ reread_log_header: msg("Error: cannot read redo log header"); unlock_and_fail: mysql_mutex_unlock(&log_sys.mutex); -free_and_fail: - aligned_free(const_cast<byte*>(field_ref_zero)); - field_ref_zero = nullptr; - goto fail; } if (log_sys.log.format == 0) { @@ -4653,7 +4643,7 @@ free_and_fail: xtrabackup_init_datasinks(); if (!select_history()) { - goto free_and_fail; + goto fail; } /* open the log file */ @@ -4662,7 +4652,7 @@ free_and_fail: if (dst_log_file == NULL) { msg("Error: failed to open the target stream for '%s'.", LOG_FILE_NAME); - goto free_and_fail; + goto fail; } /* label it */ @@ -4700,7 +4690,7 @@ free_and_fail: if (ds_write(dst_log_file, log_hdr_buf, LOG_FILE_HDR_SIZE)) { msg("error: write to logfile failed"); aligned_free(log_hdr_buf); - goto free_and_fail; + goto fail; } aligned_free(log_hdr_buf); @@ -4721,7 +4711,7 @@ free_and_fail: " error %s.", ut_strerr(err)); fail_before_log_copying_thread_start: log_copying_running = false; - goto free_and_fail; + goto fail; } /* copy log file by current position */ @@ -4744,7 +4734,7 @@ fail_before_log_copying_thread_start: /* FLUSH CHANGED_PAGE_BITMAPS call */ if (!flush_changed_page_bitmaps()) { - goto free_and_fail; + goto fail; } ut_a(xtrabackup_parallel > 0); @@ -4812,9 +4802,6 @@ fail_before_log_copying_thread_start: if (opt_log_innodb_page_corruption) ok = corrupted_pages.print_to_file(MB_CORRUPTED_PAGES_FILE); - aligned_free(const_cast<byte*>(field_ref_zero)); - field_ref_zero = nullptr; - if (!ok) { goto fail; } @@ -6997,6 +6984,20 @@ static int main_low(char** argv) } } + ut_ad(!field_ref_zero); + if (auto b = aligned_malloc(UNIV_PAGE_SIZE_MAX, 4096)) { + field_ref_zero = static_cast<byte*>( + memset_aligned<4096>(b, 0, UNIV_PAGE_SIZE_MAX)); + } else { + msg("Can't allocate memory for field_ref_zero"); + return EXIT_FAILURE; + } + + auto _ = make_scope_exit([]() { + aligned_free(const_cast<byte*>(field_ref_zero)); + field_ref_zero = nullptr; + }); + /* --backup */ if (xtrabackup_backup && !xtrabackup_backup_func()) { return(EXIT_FAILURE); diff --git a/mysql-test/suite/mariabackup/incremental_backup.test b/mysql-test/suite/mariabackup/incremental_backup.test index 62cdf9e6cb3..ec38af4c27d 100644 --- a/mysql-test/suite/mariabackup/incremental_backup.test +++ b/mysql-test/suite/mariabackup/incremental_backup.test @@ -8,6 +8,7 @@ if (`select @@max_binlog_stmt_cache_size = 4294963200 and @@innodb_page_size = 6 call mtr.add_suppression("InnoDB: New log files created"); +let $test_comp=`select @@innodb_page_size < 32768`; let basedir=$MYSQLTEST_VARDIR/tmp/backup; let incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1; @@ -16,6 +17,14 @@ CREATE TABLE t(i INT PRIMARY KEY) ENGINE INNODB; # MDEV-515 takes X-lock on the table for the first insert. # So concurrent insert won't happen on the table INSERT INTO t VALUES(100); +if ($test_comp) { + # If MDEV-28474 is not fixed, backup preparing will crash with SIGSEGV. + --disable_query_log + --disable_result_log + CREATE TABLE t_comp(i INT PRIMARY KEY) ENGINE INNODB ROW_FORMAT=COMPRESSED; + --enable_query_log + --enable_result_log +} BEGIN; INSERT INTO t VALUES(2); connect (con1,localhost,root,,); @@ -99,6 +108,13 @@ let $targetdir=$basedir; SELECT * FROM t; DROP TABLE t; +if ($test_comp) { + --disable_query_log + --disable_result_log + DROP TABLE t_comp; + --enable_query_log + --enable_result_log +} DROP TABLE t_aria; # Cleanup diff --git a/sql/item.h b/sql/item.h index cb6393af06d..e38860dfbbb 100644 --- a/sql/item.h +++ b/sql/item.h @@ -6643,9 +6643,9 @@ public: bool get_date(THD *thd, MYSQL_TIME *ltime,date_mode_t fuzzydate) override; bool val_native(THD *thd, Native *to) override; bool val_native_result(THD *thd, Native *to) override; - longlong val_datetime_packed(THD *thd) + longlong val_datetime_packed(THD *thd) override { return Item::val_datetime_packed(thd); } - longlong val_time_packed(THD *thd) + longlong val_time_packed(THD *thd) override { return Item::val_time_packed(thd); } /* Result variants */ diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index c809730841d..73492eca216 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1116,15 +1116,19 @@ bool buf_pool_t::create() ut_ad(srv_buf_pool_size > 0); ut_ad(!resizing); ut_ad(!chunks_old); - ut_ad(!field_ref_zero); + /* mariabackup loads tablespaces, and it requires field_ref_zero to be + allocated before innodb initialization */ + ut_ad(srv_operation >= SRV_OPERATION_RESTORE || !field_ref_zero); NUMA_MEMPOLICY_INTERLEAVE_IN_SCOPE; - if (auto b= aligned_malloc(UNIV_PAGE_SIZE_MAX, 4096)) - field_ref_zero= static_cast<const byte*> - (memset_aligned<4096>(b, 0, UNIV_PAGE_SIZE_MAX)); - else - return true; + if (!field_ref_zero) { + if (auto b= aligned_malloc(UNIV_PAGE_SIZE_MAX, 4096)) + field_ref_zero= static_cast<const byte*> + (memset_aligned<4096>(b, 0, UNIV_PAGE_SIZE_MAX)); + else + return true; + } chunk_t::map_reg= UT_NEW_NOKEY(chunk_t::map()); |
