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.
This commit is contained in:
Thirunarayanan Balathandayuthapani 2019-07-11 18:24:27 +05:30
parent e52fea3fe9
commit aba2b41e9e
2 changed files with 33 additions and 32 deletions

View file

@ -951,26 +951,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);
/* 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. */
i += 8;
}
#endif
do {
if (read_buf[i]) {
return true;
if (i == FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION
&& (!space || !space->id)) {
i += 8;
}
} while (++i < srv_page_size);
return false;
#endif
if (read_buf[i]) {
all_zeroes = false;
break;
}
}
if (all_zeroes) {
return false;
}
}
switch (curr_algo) {

View file

@ -950,24 +950,25 @@ 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;
/* 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;
}
} 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. */
i += 8;
}
do {
if (read_buf[i]) {
return true;
all_zeroes = false;
break;
}
} while (++i < srv_page_size);
return false;
}
if (all_zeroes) {
return false;
}
}
switch (curr_algo) {