MDEV-17957 Make Innodb_checksum_algorithm stricter for strict_* values
Problem: Innodb_checksum_algorithm checks for all checksum algorithm to validate the page checksum even though the algorithm is specified as strict_crc32, strict_innodb, strict_none. Fix: Remove the checks for all checksum algorithm to validate the page checksum if the algo is specified as strict_* values.
This commit is contained in:
parent
ce1669af12
commit
5f5e73f1fe
@ -581,6 +581,8 @@ buf_page_is_corrupted(
|
||||
|
||||
ulint checksum_field1;
|
||||
ulint checksum_field2;
|
||||
ib_uint32_t crc32 = ULINT32_UNDEFINED;
|
||||
bool crc32_inited = false;
|
||||
|
||||
if (!zip_size
|
||||
&& memcmp(read_buf + FIL_PAGE_LSN + 4,
|
||||
@ -660,120 +662,124 @@ buf_page_is_corrupted(
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
ulint page_no = mach_read_from_4(read_buf + FIL_PAGE_OFFSET);
|
||||
ulint space_id = mach_read_from_4(read_buf + FIL_PAGE_SPACE_ID);
|
||||
const srv_checksum_algorithm_t curr_algo =
|
||||
static_cast<srv_checksum_algorithm_t>(srv_checksum_algorithm);
|
||||
|
||||
switch (curr_algo) {
|
||||
case SRV_CHECKSUM_ALGORITHM_CRC32:
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
|
||||
|
||||
if (buf_page_is_checksum_valid_crc32(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
return(FALSE);
|
||||
if (buf_page_is_checksum_valid_crc32(read_buf, checksum_field1,
|
||||
checksum_field2)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_none(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_NONE,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_innodb(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_INNODB,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
|
||||
case SRV_CHECKSUM_ALGORITHM_INNODB:
|
||||
return TRUE;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
|
||||
|
||||
if (buf_page_is_checksum_valid_innodb(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
return(FALSE);
|
||||
if (buf_page_is_checksum_valid_innodb(read_buf, checksum_field1,
|
||||
checksum_field2)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_none(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_NONE,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_crc32(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_CRC32,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
|
||||
return TRUE;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_NONE:
|
||||
|
||||
if (buf_page_is_checksum_valid_none(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
return(FALSE);
|
||||
if (buf_page_is_checksum_valid_none(read_buf, checksum_field1,
|
||||
checksum_field2)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_crc32(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_CRC32,
|
||||
space_id, page_no);
|
||||
return(FALSE);
|
||||
return TRUE;
|
||||
case SRV_CHECKSUM_ALGORITHM_CRC32:
|
||||
case SRV_CHECKSUM_ALGORITHM_INNODB:
|
||||
/* Verify old versions of InnoDB only stored 8 byte lsn to the
|
||||
start and end of the page. */
|
||||
|
||||
/* Since innodb_checksum_algorithm is not strict_* allow
|
||||
any of the algos to match for the old field. */
|
||||
|
||||
if (checksum_field2
|
||||
!= mach_read_from_4(read_buf + FIL_PAGE_LSN)
|
||||
&& checksum_field2 != BUF_NO_CHECKSUM_MAGIC) {
|
||||
|
||||
if (srv_checksum_algorithm
|
||||
== SRV_CHECKSUM_ALGORITHM_CRC32) {
|
||||
|
||||
crc32 = buf_calc_page_crc32(read_buf);
|
||||
crc32_inited = true;
|
||||
|
||||
if (checksum_field2 != crc32
|
||||
&& checksum_field2
|
||||
!= buf_calc_page_old_checksum(read_buf)) {
|
||||
return TRUE;
|
||||
}
|
||||
} else {
|
||||
ut_ad(srv_checksum_algorithm
|
||||
== SRV_CHECKSUM_ALGORITHM_INNODB);
|
||||
|
||||
if (checksum_field2
|
||||
!= buf_calc_page_old_checksum(read_buf)) {
|
||||
|
||||
crc32 = buf_calc_page_crc32(read_buf);
|
||||
crc32_inited = TRUE;
|
||||
|
||||
if (checksum_field2 != crc32) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_innodb(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_INNODB,
|
||||
space_id, page_no);
|
||||
return(FALSE);
|
||||
/* Old field is fine, check the new field */
|
||||
|
||||
if (checksum_field1 != 0
|
||||
&& checksum_field1 != BUF_NO_CHECKSUM_MAGIC) {
|
||||
|
||||
if (srv_checksum_algorithm
|
||||
== SRV_CHECKSUM_ALGORITHM_CRC32) {
|
||||
|
||||
if (!crc32_inited) {
|
||||
crc32 = buf_calc_page_crc32(read_buf);
|
||||
crc32_inited = TRUE;
|
||||
}
|
||||
|
||||
if (checksum_field1 != crc32
|
||||
&& checksum_field1
|
||||
!= buf_calc_page_new_checksum(read_buf)) {
|
||||
return TRUE;
|
||||
}
|
||||
} else {
|
||||
ut_ad(srv_checksum_algorithm
|
||||
== SRV_CHECKSUM_ALGORITHM_INNODB);
|
||||
|
||||
if (checksum_field1
|
||||
!= buf_calc_page_new_checksum(read_buf)) {
|
||||
|
||||
if (!crc32_inited) {
|
||||
crc32 = buf_calc_page_crc32(
|
||||
read_buf);
|
||||
crc32_inited = TRUE;
|
||||
}
|
||||
|
||||
if (checksum_field1 != crc32) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
if (crc32_inited
|
||||
&& ((checksum_field1 == crc32
|
||||
&& checksum_field2 != crc32)
|
||||
|| (checksum_field1 != crc32
|
||||
&& checksum_field2 == crc32))) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SRV_CHECKSUM_ALGORITHM_NONE:
|
||||
/* should have returned FALSE earlier */
|
||||
break;
|
||||
/* no default so the compiler will emit a warning if new enum
|
||||
is added and not handled here */
|
||||
ut_error;
|
||||
}
|
||||
|
||||
ut_error;
|
||||
return(FALSE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/** Dump a page to stderr.
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2013, 2016, MariaDB Corporation
|
||||
Copyright (c) 2013, 2018, MariaDB Corporation.
|
||||
|
||||
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
|
||||
@ -1123,19 +1123,6 @@ const rec_t*
|
||||
page_find_rec_max_not_deleted(
|
||||
const page_t* page);
|
||||
|
||||
/** Issue a warning when the checksum that is stored in the page is valid,
|
||||
but different than the global setting innodb_checksum_algorithm.
|
||||
@param[in] current_algo current checksum algorithm
|
||||
@param[in] page_checksum page valid checksum
|
||||
@param[in] space_id tablespace id
|
||||
@param[in] page_no page number */
|
||||
void
|
||||
page_warn_strict_checksum(
|
||||
srv_checksum_algorithm_t curr_algo,
|
||||
srv_checksum_algorithm_t page_checksum,
|
||||
ulint space_id,
|
||||
ulint page_no);
|
||||
|
||||
#ifdef UNIV_MATERIALIZE
|
||||
#undef UNIV_INLINE
|
||||
#define UNIV_INLINE UNIV_INLINE_ORIGINAL
|
||||
|
@ -546,21 +546,6 @@ from outside the buffer pool.
|
||||
# define UNIV_INLINE UNIV_INLINE_ORIGINAL
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_INNOCHECKSUM
|
||||
/** Issue a warning when the checksum that is stored in the page is valid,
|
||||
but different than the global setting innodb_checksum_algorithm.
|
||||
@param[in] current_algo current checksum algorithm
|
||||
@param[in] page_checksum page valid checksum
|
||||
@param[in] space_id tablespace id
|
||||
@param[in] page_no page number */
|
||||
void
|
||||
page_warn_strict_checksum(
|
||||
srv_checksum_algorithm_t curr_algo,
|
||||
srv_checksum_algorithm_t page_checksum,
|
||||
ulint space_id,
|
||||
ulint page_no);
|
||||
#endif /* UNIV_INNOCHECKSUM */
|
||||
|
||||
#ifndef UNIV_INNOCHECKSUM
|
||||
#ifndef UNIV_NONINL
|
||||
# include "page0zip.ic"
|
||||
|
@ -2807,45 +2807,3 @@ page_find_rec_max_not_deleted(
|
||||
}
|
||||
return(prev_rec);
|
||||
}
|
||||
|
||||
/** Issue a warning when the checksum that is stored in the page is valid,
|
||||
but different than the global setting innodb_checksum_algorithm.
|
||||
@param[in] current_algo current checksum algorithm
|
||||
@param[in] page_checksum page valid checksum
|
||||
@param[in] space_id tablespace id
|
||||
@param[in] page_no page number */
|
||||
void
|
||||
page_warn_strict_checksum(
|
||||
srv_checksum_algorithm_t curr_algo,
|
||||
srv_checksum_algorithm_t page_checksum,
|
||||
ulint space_id,
|
||||
ulint page_no)
|
||||
{
|
||||
srv_checksum_algorithm_t curr_algo_nonstrict;
|
||||
switch (curr_algo) {
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
|
||||
curr_algo_nonstrict = SRV_CHECKSUM_ALGORITHM_CRC32;
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
|
||||
curr_algo_nonstrict = SRV_CHECKSUM_ALGORITHM_INNODB;
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_NONE:
|
||||
curr_algo_nonstrict = SRV_CHECKSUM_ALGORITHM_NONE;
|
||||
break;
|
||||
default:
|
||||
ut_error;
|
||||
}
|
||||
|
||||
ib_logf(IB_LOG_LEVEL_WARN,
|
||||
"innodb_checksum_algorithm is set to \"%s\""
|
||||
" but the page [page id: space=" ULINTPF ","
|
||||
" page number=" ULINTPF "] contains a valid checksum \"%s\"."
|
||||
" Accepting the page as valid. Change innodb_checksum_algorithm"
|
||||
" to \"%s\" to silently accept such pages or rewrite all pages"
|
||||
" so that they contain \"%s\" checksum.",
|
||||
buf_checksum_algorithm_name(curr_algo),
|
||||
space_id, page_no,
|
||||
buf_checksum_algorithm_name(page_checksum),
|
||||
buf_checksum_algorithm_name(curr_algo_nonstrict),
|
||||
buf_checksum_algorithm_name(curr_algo_nonstrict));
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2012, Facebook Inc.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
Copyright (c) 2014, 2018, MariaDB Corporation.
|
||||
|
||||
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
|
||||
@ -48,8 +48,6 @@ using namespace std;
|
||||
#include "btr0cur.h"
|
||||
#include "page0types.h"
|
||||
#include "log0recv.h"
|
||||
#else
|
||||
#define page_warn_strict_checksum(A,B,C,D)
|
||||
#endif /* !UNIV_INNOCHECKSUM */
|
||||
#include "zlib.h"
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
@ -4926,13 +4924,6 @@ page_zip_verify_checksum(
|
||||
stored = static_cast<ib_uint32_t>(mach_read_from_4(
|
||||
static_cast<const unsigned char*>(data) + FIL_PAGE_SPACE_OR_CHKSUM));
|
||||
|
||||
ulint page_no MY_ATTRIBUTE((unused)) =
|
||||
mach_read_from_4(static_cast<const unsigned char*>
|
||||
(data) + FIL_PAGE_OFFSET);
|
||||
ulint space_id MY_ATTRIBUTE((unused)) =
|
||||
mach_read_from_4(static_cast<const unsigned char*>
|
||||
(data) + FIL_PAGE_SPACE_ID);
|
||||
|
||||
#if FIL_PAGE_LSN % 8
|
||||
#error "FIL_PAGE_LSN must be 64 bit aligned"
|
||||
#endif
|
||||
@ -4974,97 +4965,31 @@ page_zip_verify_checksum(
|
||||
|
||||
switch (curr_algo) {
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
|
||||
case SRV_CHECKSUM_ALGORITHM_CRC32:
|
||||
|
||||
if (stored == BUF_NO_CHECKSUM_MAGIC) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_NONE,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
innodb = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_INNODB));
|
||||
|
||||
if (stored == innodb) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_INNODB,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
|
||||
case SRV_CHECKSUM_ALGORITHM_INNODB:
|
||||
|
||||
if (stored == BUF_NO_CHECKSUM_MAGIC) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_NONE,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
crc32 = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_CRC32));
|
||||
|
||||
if (stored == crc32) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_CRC32,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_NONE:
|
||||
return stored == calc;
|
||||
|
||||
crc32 = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_CRC32));
|
||||
|
||||
if (stored == crc32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo, SRV_CHECKSUM_ALGORITHM_CRC32,
|
||||
space_id, page_no);
|
||||
|
||||
case SRV_CHECKSUM_ALGORITHM_CRC32:
|
||||
if (stored == BUF_NO_CHECKSUM_MAGIC) {
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
crc32 = calc;
|
||||
innodb = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_INNODB));
|
||||
|
||||
if (stored == innodb) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_INNODB,
|
||||
space_id, page_no);
|
||||
return(TRUE);
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_INNODB:
|
||||
if (stored == BUF_NO_CHECKSUM_MAGIC) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
crc32 = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_CRC32));
|
||||
innodb = calc;
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_NONE:
|
||||
ut_error;
|
||||
/* no default so the compiler will emit a warning if new enum
|
||||
is added and not handled here */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
return (stored == crc32 || stored == innodb);
|
||||
}
|
||||
|
@ -653,6 +653,8 @@ buf_page_is_corrupted(
|
||||
|
||||
ulint checksum_field1;
|
||||
ulint checksum_field2;
|
||||
ib_uint32_t crc32 = ULINT32_UNDEFINED;
|
||||
bool crc32_inited = false;
|
||||
|
||||
if (!zip_size
|
||||
&& memcmp(read_buf + FIL_PAGE_LSN + 4,
|
||||
@ -732,120 +734,124 @@ buf_page_is_corrupted(
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
ulint page_no = mach_read_from_4(read_buf + FIL_PAGE_OFFSET);
|
||||
ulint space_id = mach_read_from_4(read_buf + FIL_PAGE_SPACE_ID);
|
||||
const srv_checksum_algorithm_t curr_algo =
|
||||
static_cast<srv_checksum_algorithm_t>(srv_checksum_algorithm);
|
||||
|
||||
switch (curr_algo) {
|
||||
case SRV_CHECKSUM_ALGORITHM_CRC32:
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
|
||||
|
||||
if (buf_page_is_checksum_valid_crc32(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
return(FALSE);
|
||||
if (buf_page_is_checksum_valid_crc32(read_buf, checksum_field1,
|
||||
checksum_field2)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_none(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_NONE,
|
||||
space_id, page_no);
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_innodb(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_INNODB,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
|
||||
case SRV_CHECKSUM_ALGORITHM_INNODB:
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
|
||||
|
||||
if (buf_page_is_checksum_valid_innodb(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
return(FALSE);
|
||||
if (buf_page_is_checksum_valid_innodb(read_buf, checksum_field1,
|
||||
checksum_field2)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_none(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_NONE,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_crc32(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_CRC32,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
|
||||
return TRUE;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_NONE:
|
||||
|
||||
if (buf_page_is_checksum_valid_none(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
return(FALSE);
|
||||
if (buf_page_is_checksum_valid_none(read_buf, checksum_field1,
|
||||
checksum_field2)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_crc32(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_CRC32,
|
||||
space_id, page_no);
|
||||
return(FALSE);
|
||||
return TRUE;
|
||||
case SRV_CHECKSUM_ALGORITHM_CRC32:
|
||||
case SRV_CHECKSUM_ALGORITHM_INNODB:
|
||||
/* Verify old versions of InnoDB only stored 8 byte lsn to the
|
||||
start and end of the page. */
|
||||
|
||||
/* Since innodb_checksum_algorithm is not strict_* allow
|
||||
any of the algos to match for the old field. */
|
||||
|
||||
if (checksum_field2
|
||||
!= mach_read_from_4(read_buf + FIL_PAGE_LSN)
|
||||
&& checksum_field2 != BUF_NO_CHECKSUM_MAGIC) {
|
||||
|
||||
if (srv_checksum_algorithm
|
||||
== SRV_CHECKSUM_ALGORITHM_CRC32) {
|
||||
|
||||
crc32 = buf_calc_page_crc32(read_buf);
|
||||
crc32_inited = true;
|
||||
|
||||
if (checksum_field2 != crc32
|
||||
&& checksum_field2
|
||||
!= buf_calc_page_old_checksum(read_buf)) {
|
||||
return TRUE;
|
||||
}
|
||||
} else {
|
||||
ut_ad(srv_checksum_algorithm
|
||||
== SRV_CHECKSUM_ALGORITHM_INNODB);
|
||||
|
||||
if (checksum_field2
|
||||
!= buf_calc_page_old_checksum(read_buf)) {
|
||||
|
||||
crc32 = buf_calc_page_crc32(read_buf);
|
||||
crc32_inited = TRUE;
|
||||
|
||||
if (checksum_field2 != crc32) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (buf_page_is_checksum_valid_innodb(read_buf,
|
||||
checksum_field1, checksum_field2)) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_INNODB,
|
||||
space_id, page_no);
|
||||
return(FALSE);
|
||||
/* Old field is fine, check the new field */
|
||||
|
||||
if (checksum_field1 != 0
|
||||
&& checksum_field1 != BUF_NO_CHECKSUM_MAGIC) {
|
||||
|
||||
if (srv_checksum_algorithm
|
||||
== SRV_CHECKSUM_ALGORITHM_CRC32) {
|
||||
|
||||
if (!crc32_inited) {
|
||||
crc32 = buf_calc_page_crc32(read_buf);
|
||||
crc32_inited = TRUE;
|
||||
}
|
||||
|
||||
if (checksum_field1 != crc32
|
||||
&& checksum_field1
|
||||
!= buf_calc_page_new_checksum(read_buf)) {
|
||||
return TRUE;
|
||||
}
|
||||
} else {
|
||||
ut_ad(srv_checksum_algorithm
|
||||
== SRV_CHECKSUM_ALGORITHM_INNODB);
|
||||
|
||||
if (checksum_field1
|
||||
!= buf_calc_page_new_checksum(read_buf)) {
|
||||
|
||||
if (!crc32_inited) {
|
||||
crc32 = buf_calc_page_crc32(
|
||||
read_buf);
|
||||
crc32_inited = TRUE;
|
||||
}
|
||||
|
||||
if (checksum_field1 != crc32) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
if (crc32_inited
|
||||
&& ((checksum_field1 == crc32
|
||||
&& checksum_field2 != crc32)
|
||||
|| (checksum_field1 != crc32
|
||||
&& checksum_field2 == crc32))) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case SRV_CHECKSUM_ALGORITHM_NONE:
|
||||
/* should have returned FALSE earlier */
|
||||
break;
|
||||
/* no default so the compiler will emit a warning if new enum
|
||||
is added and not handled here */
|
||||
case SRV_CHECKSUM_ALGORITHM_NONE:
|
||||
ut_error;
|
||||
}
|
||||
|
||||
ut_error;
|
||||
return(FALSE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/** Dump a page to stderr.
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2013, 2018, MariaDB Corporation.
|
||||
|
||||
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
|
||||
@ -1109,23 +1110,6 @@ const rec_t*
|
||||
page_find_rec_max_not_deleted(
|
||||
const page_t* page);
|
||||
|
||||
#endif /* #ifndef UNIV_INNOCHECKSUM */
|
||||
|
||||
/** Issue a warning when the checksum that is stored in the page is valid,
|
||||
but different than the global setting innodb_checksum_algorithm.
|
||||
@param[in] current_algo current checksum algorithm
|
||||
@param[in] page_checksum page valid checksum
|
||||
@param[in] space_id tablespace id
|
||||
@param[in] page_no page number */
|
||||
void
|
||||
page_warn_strict_checksum(
|
||||
srv_checksum_algorithm_t curr_algo,
|
||||
srv_checksum_algorithm_t page_checksum,
|
||||
ulint space_id,
|
||||
ulint page_no);
|
||||
|
||||
#ifndef UNIV_INNOCHECKSUM
|
||||
|
||||
#ifdef UNIV_MATERIALIZE
|
||||
#undef UNIV_INLINE
|
||||
#define UNIV_INLINE UNIV_INLINE_ORIGINAL
|
||||
|
@ -2814,49 +2814,3 @@ page_find_rec_max_not_deleted(
|
||||
}
|
||||
|
||||
#endif /* #ifndef UNIV_INNOCHECKSUM */
|
||||
|
||||
/** Issue a warning when the checksum that is stored in the page is valid,
|
||||
but different than the global setting innodb_checksum_algorithm.
|
||||
@param[in] current_algo current checksum algorithm
|
||||
@param[in] page_checksum page valid checksum
|
||||
@param[in] space_id tablespace id
|
||||
@param[in] page_no page number */
|
||||
void
|
||||
page_warn_strict_checksum(
|
||||
srv_checksum_algorithm_t curr_algo,
|
||||
srv_checksum_algorithm_t page_checksum,
|
||||
ulint space_id,
|
||||
ulint page_no)
|
||||
{
|
||||
srv_checksum_algorithm_t curr_algo_nonstrict = srv_checksum_algorithm_t();
|
||||
switch (curr_algo) {
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
|
||||
curr_algo_nonstrict = SRV_CHECKSUM_ALGORITHM_CRC32;
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
|
||||
curr_algo_nonstrict = SRV_CHECKSUM_ALGORITHM_INNODB;
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_NONE:
|
||||
curr_algo_nonstrict = SRV_CHECKSUM_ALGORITHM_NONE;
|
||||
break;
|
||||
default:
|
||||
ut_error;
|
||||
}
|
||||
|
||||
#ifdef UNIV_INNOCHECKSUM
|
||||
fprintf(stderr,
|
||||
#else
|
||||
ib_logf(IB_LOG_LEVEL_WARN,
|
||||
#endif
|
||||
"innodb_checksum_algorithm is set to \"%s\""
|
||||
" but the page [page id: space=" ULINTPF ","
|
||||
" page number=" ULINTPF "] contains a valid checksum \"%s\"."
|
||||
" Accepting the page as valid. Change innodb_checksum_algorithm"
|
||||
" to \"%s\" to silently accept such pages or rewrite all pages"
|
||||
" so that they contain \"%s\" checksum.",
|
||||
buf_checksum_algorithm_name(curr_algo),
|
||||
space_id, page_no,
|
||||
buf_checksum_algorithm_name(page_checksum),
|
||||
buf_checksum_algorithm_name(curr_algo_nonstrict),
|
||||
buf_checksum_algorithm_name(curr_algo_nonstrict));
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2012, Facebook Inc.
|
||||
Copyright (c) 2014, SkySQL Ab. All Rights Reserved.
|
||||
Copyright (c) 2014, 2018, MariaDB Corporation.
|
||||
|
||||
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
|
||||
@ -4934,10 +4934,6 @@ page_zip_verify_checksum(
|
||||
stored = static_cast<ib_uint32_t>(mach_read_from_4(
|
||||
static_cast<const unsigned char*>(data) + FIL_PAGE_SPACE_OR_CHKSUM));
|
||||
|
||||
ulint page_no = mach_read_from_4(static_cast<const unsigned char*> (data) + FIL_PAGE_OFFSET);
|
||||
ulint space_id = mach_read_from_4(static_cast<const unsigned char*>
|
||||
(data) + FIL_PAGE_SPACE_ID);
|
||||
|
||||
#if FIL_PAGE_LSN % 8
|
||||
#error "FIL_PAGE_LSN must be 64 bit aligned"
|
||||
#endif
|
||||
@ -4974,97 +4970,30 @@ page_zip_verify_checksum(
|
||||
|
||||
switch (curr_algo) {
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
|
||||
case SRV_CHECKSUM_ALGORITHM_CRC32:
|
||||
|
||||
if (stored == BUF_NO_CHECKSUM_MAGIC) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_NONE,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
innodb = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_INNODB));
|
||||
|
||||
if (stored == innodb) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_CRC32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_INNODB,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
|
||||
case SRV_CHECKSUM_ALGORITHM_INNODB:
|
||||
|
||||
if (stored == BUF_NO_CHECKSUM_MAGIC) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_NONE,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
crc32 = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_CRC32));
|
||||
|
||||
if (stored == crc32) {
|
||||
if (curr_algo
|
||||
== SRV_CHECKSUM_ALGORITHM_STRICT_INNODB) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_CRC32,
|
||||
space_id, page_no);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_STRICT_NONE:
|
||||
|
||||
crc32 = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_CRC32));
|
||||
|
||||
if (stored == crc32) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo, SRV_CHECKSUM_ALGORITHM_CRC32,
|
||||
space_id, page_no);
|
||||
|
||||
return stored == calc;
|
||||
case SRV_CHECKSUM_ALGORITHM_CRC32:
|
||||
if (stored == BUF_NO_CHECKSUM_MAGIC) {
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
crc32 = calc;
|
||||
innodb = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_INNODB));
|
||||
|
||||
if (stored == innodb) {
|
||||
page_warn_strict_checksum(
|
||||
curr_algo,
|
||||
SRV_CHECKSUM_ALGORITHM_INNODB,
|
||||
space_id, page_no);
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_INNODB:
|
||||
if (stored == BUF_NO_CHECKSUM_MAGIC) {
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
crc32 = static_cast<ib_uint32_t>(page_zip_calc_checksum(
|
||||
data, size, SRV_CHECKSUM_ALGORITHM_CRC32));
|
||||
innodb = calc;
|
||||
break;
|
||||
case SRV_CHECKSUM_ALGORITHM_NONE:
|
||||
ut_error;
|
||||
/* no default so the compiler will emit a warning if new enum
|
||||
is added and not handled here */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
return (stored == crc32 || stored == innodb);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user