mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 18:20:07 +01:00
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:
parent
e52fea3fe9
commit
aba2b41e9e
2 changed files with 33 additions and 32 deletions
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue