From 09ee95e33ef41a9b7c47eefd0abde5b1a246a93f Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 11 May 2022 13:24:39 +1000 Subject: [PATCH 1/2] MDEV-28534: clang-12 compile warnings Errors where: /buildbot/amd64-ubuntu-2004-msan/build/sql/item.h:6478:12: error: 'val_datetime_packed' overrides a member function but is not marked 'override' [-Werror,-Winconsistent-missing-override] longlong val_datetime_packed(THD *thd) ^ /buildbot/amd64-ubuntu-2004-msan/build/sql/item.h:3501:12: note: overridden virtual function is here longlong val_datetime_packed(THD *thd) override; ^ /buildbot/amd64-ubuntu-2004-msan/build/sql/item.h:6480:12: error: 'val_time_packed' overrides a member function but is not marked 'override' [-Werror,-Winconsistent-missing-override] longlong val_time_packed(THD *thd) ^ /buildbot/amd64-ubuntu-2004-msan/build/sql/item.h:3502:12: note: overridden virtual function is here longlong val_time_packed(THD *thd) override; ^ --- sql/item.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/item.h b/sql/item.h index 5af6dc3bf49..a6de33c0c3a 100644 --- a/sql/item.h +++ b/sql/item.h @@ -6475,9 +6475,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 */ From 3fabdc3ca889db0e490df3a9a48ae527f21eed45 Mon Sep 17 00:00:00 2001 From: Vlad Lesin Date: Fri, 6 May 2022 10:49:35 +0300 Subject: [PATCH 2/2] MDEV-28473 field_ref_zero is not initialized in xtrabackup_prepare_func() The solution is to initialize field_ref_zero in main_low() before xtrabackup_backup_func() and xtrabackup_prepare_func() calls. --- extra/mariabackup/xtrabackup.cc | 41 ++++++++++--------- .../suite/mariabackup/incremental_backup.test | 16 ++++++++ storage/innobase/buf/buf0buf.cc | 16 +++++--- 3 files changed, 47 insertions(+), 26 deletions(-) diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 2b2adf0643c..13319f44969 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -51,6 +51,7 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #include #include #include +#include #include #include @@ -4511,13 +4512,6 @@ fail: } - if (auto b = aligned_malloc(UNIV_PAGE_SIZE_MAX, 4096)) { - field_ref_zero = static_cast( - memset_aligned<4096>(b, 0, UNIV_PAGE_SIZE_MAX)); - } else { - goto fail; - } - { /* definition from recv_recovery_from_checkpoint_start() */ ulint max_cp_field; @@ -4534,10 +4528,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(field_ref_zero)); - field_ref_zero = nullptr; - goto fail; } if (log_sys.log.format == 0) { @@ -4563,7 +4553,7 @@ free_and_fail: xtrabackup_init_datasinks(); if (!select_history()) { - goto free_and_fail; + goto fail; } /* open the log file */ @@ -4572,7 +4562,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 */ @@ -4610,7 +4600,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); @@ -4631,7 +4621,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 */ @@ -4648,7 +4638,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); @@ -4670,7 +4660,7 @@ fail_before_log_copying_thread_start: datafiles_iter_t *it = datafiles_iter_new(); if (it == NULL) { msg("mariabackup: Error: datafiles_iter_new() failed."); - goto free_and_fail; + goto fail; } /* Create data copying threads */ @@ -4725,9 +4715,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(field_ref_zero)); - field_ref_zero = nullptr; - if (!ok) { goto fail; } @@ -6932,6 +6919,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( + 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(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 88e277fd95a..ddcdae4637a 100644 --- a/mysql-test/suite/mariabackup/incremental_backup.test +++ b/mysql-test/suite/mariabackup/incremental_backup.test @@ -8,11 +8,20 @@ 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; CREATE TABLE t_aria(i INT) ENGINE ARIA; CREATE TABLE t(i INT PRIMARY KEY) ENGINE INNODB; +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,,); @@ -96,6 +105,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/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 98a8f552895..0bb697e7f0a 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1346,15 +1346,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 - (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 + (memset_aligned<4096>(b, 0, UNIV_PAGE_SIZE_MAX)); + else + return true; + } chunk_t::map_reg= UT_NEW_NOKEY(chunk_t::map());