Skip to content

Commit

Permalink
MDEV-28473 field_ref_zero is not initialized in xtrabackup_prepare_fu…
Browse files Browse the repository at this point in the history
…nc()

The solution is to initialize field_ref_zero in main_low() before
xtrabackup_backup_func() and xtrabackup_prepare_func() calls.
  • Loading branch information
vlad-lesin committed May 11, 2022
1 parent 09ee95e commit 3fabdc3
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 26 deletions.
41 changes: 21 additions & 20 deletions extra/mariabackup/xtrabackup.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -4511,13 +4512,6 @@ static bool xtrabackup_backup_func()
}


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;
Expand All @@ -4534,10 +4528,6 @@ static bool xtrabackup_backup_func()
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) {
Expand All @@ -4563,7 +4553,7 @@ static bool xtrabackup_backup_func()
xtrabackup_init_datasinks();

if (!select_history()) {
goto free_and_fail;
goto fail;
}

/* open the log file */
Expand All @@ -4572,7 +4562,7 @@ static bool xtrabackup_backup_func()
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 */
Expand Down Expand Up @@ -4610,7 +4600,7 @@ static bool xtrabackup_backup_func()
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);
Expand All @@ -4631,7 +4621,7 @@ static bool xtrabackup_backup_func()
" 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 */
Expand All @@ -4648,7 +4638,7 @@ static bool xtrabackup_backup_func()

/* FLUSH CHANGED_PAGE_BITMAPS call */
if (!flush_changed_page_bitmaps()) {
goto free_and_fail;
goto fail;
}

ut_a(xtrabackup_parallel > 0);
Expand All @@ -4670,7 +4660,7 @@ static bool xtrabackup_backup_func()
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 */
Expand Down Expand Up @@ -4725,9 +4715,6 @@ static bool xtrabackup_backup_func()
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;
}
Expand Down Expand Up @@ -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<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);
Expand Down
16 changes: 16 additions & 0 deletions mysql-test/suite/mariabackup/incremental_backup.test
Original file line number Diff line number Diff line change
Expand Up @@ -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,,);
Expand Down Expand Up @@ -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
Expand Down
16 changes: 10 additions & 6 deletions storage/innobase/buf/buf0buf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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<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());

Expand Down

0 comments on commit 3fabdc3

Please sign in to comment.