summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-05-12 08:11:57 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2022-05-12 08:11:57 +0300
commitdaa2680c78d155868c5d0d14345669ecea13069b (patch)
tree666e9f06f6eb8a05804cea63020c99b62d1bee57
parent7da0f30ccc5446cf6c30289e51d461b7f0595891 (diff)
parent3fabdc3ca889db0e490df3a9a48ae527f21eed45 (diff)
downloadmariadb-git-daa2680c78d155868c5d0d14345669ecea13069b.tar.gz
Merge 10.5 into 10.6
-rw-r--r--extra/mariabackup/xtrabackup.cc39
-rw-r--r--mysql-test/suite/mariabackup/incremental_backup.test16
-rw-r--r--sql/item.h4
-rw-r--r--storage/innobase/buf/buf0buf.cc16
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());