mirror of
https://github.com/MariaDB/server.git
synced 2025-01-25 00:04:33 +01:00
Port r529 of branches/5.0: Port r27 of innodb-4.1/trunk: Check the page
trailers also after writing to disk. This improves the chances of diagnosing Bug #18886. os_file_check_page_trailers(): New function for checking that the two copies of the LSN stamped on the pages match. os_aio_simulated_handle(): Call os_file_check_page_trailers() before and after os_file_write().
This commit is contained in:
parent
4299f60dc8
commit
0677a1ec8e
1 changed files with 36 additions and 23 deletions
59
os/os0file.c
59
os/os0file.c
|
@ -3679,6 +3679,37 @@ os_aio_posix_handle(
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
Do a 'last millisecond' check that the page end is sensible;
|
||||||
|
reported page checksum errors from Linux seem to wipe over the page end. */
|
||||||
|
static
|
||||||
|
void
|
||||||
|
os_file_check_page_trailers(
|
||||||
|
/*========================*/
|
||||||
|
byte* combined_buf, /* in: combined write buffer */
|
||||||
|
ulint total_len) /* in: size of combined_buf, in bytes
|
||||||
|
(a multiple of UNIV_PAGE_SIZE) */
|
||||||
|
{
|
||||||
|
ulint len;
|
||||||
|
|
||||||
|
for (len = 0; len + UNIV_PAGE_SIZE <= total_len;
|
||||||
|
len += UNIV_PAGE_SIZE) {
|
||||||
|
byte* buf = combined_buf + len;
|
||||||
|
|
||||||
|
if (memcmp(buf + (FIL_PAGE_LSN + 4), buf + (UNIV_PAGE_SIZE
|
||||||
|
- FIL_PAGE_END_LSN_OLD_CHKSUM + 4), 4)) {
|
||||||
|
ut_print_timestamp(stderr);
|
||||||
|
fprintf(stderr,
|
||||||
|
" InnoDB: ERROR: The page to be written seems corrupt!\n"
|
||||||
|
"InnoDB: Writing a block of %lu bytes, currently at offset %lu\n",
|
||||||
|
(ulong)total_len, (ulong)len);
|
||||||
|
buf_page_print(buf);
|
||||||
|
fprintf(stderr,
|
||||||
|
"InnoDB: ERROR: The page to be written seems corrupt!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
Does simulated aio. This function should be called by an i/o-handler
|
Does simulated aio. This function should be called by an i/o-handler
|
||||||
thread. */
|
thread. */
|
||||||
|
@ -3716,7 +3747,6 @@ os_aio_simulated_handle(
|
||||||
ibool ret;
|
ibool ret;
|
||||||
ulint n;
|
ulint n;
|
||||||
ulint i;
|
ulint i;
|
||||||
ulint len2;
|
|
||||||
|
|
||||||
segment = os_aio_get_array_and_local_segment(&array, global_segment);
|
segment = os_aio_get_array_and_local_segment(&array, global_segment);
|
||||||
|
|
||||||
|
@ -3924,32 +3954,15 @@ consecutive_loop:
|
||||||
ut_error;
|
ut_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do a 'last millisecond' check that the page end
|
os_file_check_page_trailers(combined_buf, total_len);
|
||||||
is sensible; reported page checksum errors from
|
|
||||||
Linux seem to wipe over the page end */
|
|
||||||
|
|
||||||
for (len2 = 0; len2 + UNIV_PAGE_SIZE <= total_len;
|
|
||||||
len2 += UNIV_PAGE_SIZE) {
|
|
||||||
if (mach_read_from_4(combined_buf + len2
|
|
||||||
+ FIL_PAGE_LSN + 4)
|
|
||||||
!= mach_read_from_4(combined_buf + len2
|
|
||||||
+ UNIV_PAGE_SIZE
|
|
||||||
- FIL_PAGE_END_LSN_OLD_CHKSUM + 4)) {
|
|
||||||
ut_print_timestamp(stderr);
|
|
||||||
fprintf(stderr,
|
|
||||||
" InnoDB: ERROR: The page to be written seems corrupt!\n");
|
|
||||||
fprintf(stderr,
|
|
||||||
"InnoDB: Writing a block of %lu bytes, currently writing at offset %lu\n",
|
|
||||||
(ulong)total_len, (ulong)len2);
|
|
||||||
buf_page_print(combined_buf + len2);
|
|
||||||
fprintf(stderr,
|
|
||||||
"InnoDB: ERROR: The page to be written seems corrupt!\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = os_file_write(slot->name, slot->file, combined_buf,
|
ret = os_file_write(slot->name, slot->file, combined_buf,
|
||||||
slot->offset, slot->offset_high, total_len);
|
slot->offset, slot->offset_high, total_len);
|
||||||
|
|
||||||
|
if (array == os_aio_write_array) {
|
||||||
|
os_file_check_page_trailers(combined_buf, total_len);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = os_file_read(slot->file, combined_buf,
|
ret = os_file_read(slot->file, combined_buf,
|
||||||
slot->offset, slot->offset_high, total_len);
|
slot->offset, slot->offset_high, total_len);
|
||||||
|
|
Loading…
Add table
Reference in a new issue