MDEV-19978 Page read from tablespace is corrupted

Problem:
=======
  Checksum fields can have value as zero. In that case, InnoDB falsely
consider that page should be all zeroes. It leads to wrong detection of page
corruption.

Solution:
========
	Remove the condition that checks if checksum fields are zero then
page should be all zeroes.
parent e52fea3f
......@@ -951,27 +951,27 @@ buf_page_is_corrupted(
the first page of each file of the system tablespace.
Ignore it for the system tablespace. */
if (!checksum_field1 && !checksum_field2) {
ulint i = 0;
do {
if (read_buf[i]) {
return true;
}
} while (++i < FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION);
/* Checksum fields can have valid value as zero.
If the page is not empty then do the checksum
calculation for the page. */
bool all_zeroes = true;
for (size_t i = 0; i < srv_page_size; i++) {
#ifndef UNIV_INNOCHECKSUM
if (!space || !space->id) {
/* Skip FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION
in the system tablespace. */
if (i == FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION
&& (!space || !space->id)) {
i += 8;
}
#endif
do {
if (read_buf[i]) {
return true;
all_zeroes = false;
break;
}
}
} while (++i < srv_page_size);
if (all_zeroes) {
return false;
}
}
switch (curr_algo) {
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
......
......@@ -950,25 +950,26 @@ buf_page_is_corrupted(
the first page of each file of the system tablespace.
Ignore it for the system tablespace. */
if (!checksum_field1 && !checksum_field2) {
ulint i = 0;
do {
if (read_buf[i]) {
return true;
}
} while (++i < FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION);
if (!space || !space->id) {
/* Skip FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION
in the system tablespace. */
/* Checksum fields can have valid value as zero.
If the page is not empty then do the checksum
calculation for the page. */
bool all_zeroes = true;
for (size_t i = 0; i < srv_page_size; i++) {
if (i == FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION
&& (!space || space->id)) {
i += 8;
}
do {
if (read_buf[i]) {
return true;
all_zeroes = false;
break;
}
}
} while (++i < srv_page_size);
if (all_zeroes) {
return false;
}
}
switch (curr_algo) {
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment