|
|
|
@ -3699,6 +3699,37 @@ os_aio_posix_handle( |
|
|
|
} |
|
|
|
#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 |
|
|
|
thread. */ |
|
|
|
@ -3736,7 +3767,6 @@ os_aio_simulated_handle( |
|
|
|
ibool ret; |
|
|
|
ulint n; |
|
|
|
ulint i; |
|
|
|
ulint len2; |
|
|
|
|
|
|
|
segment = os_aio_get_array_and_local_segment(&array, global_segment); |
|
|
|
|
|
|
|
@ -3943,33 +3973,16 @@ consecutive_loop: |
|
|
|
(ulong) total_len); |
|
|
|
ut_error; |
|
|
|
} |
|
|
|
|
|
|
|
/* Do a 'last millisecond' check that the page end |
|
|
|
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"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
os_file_check_page_trailers(combined_buf, total_len); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ret = os_file_write(slot->name, slot->file, combined_buf, |
|
|
|
slot->offset, slot->offset_high, total_len); |
|
|
|
|
|
|
|
if (array == os_aio_write_array) { |
|
|
|
os_file_check_page_trailers(combined_buf, total_len); |
|
|
|
} |
|
|
|
} else { |
|
|
|
ret = os_file_read(slot->file, combined_buf, |
|
|
|
slot->offset, slot->offset_high, total_len); |
|
|
|
|