Applied innodb-4.1-ss29 snapshot.
Fix BUG#19542 "InnoDB doesn't increase the Handler_read_prev counter. innobase/os/os0file.c: Applied innodb-4.1-ss29 snapshot. 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 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(). sql/ha_innodb.cc: Applied innodb-4.1-ss29 snapshot. Increment statistic counter in ha_innobase::index_prev().
This commit is contained in:
parent
1bdb7f7789
commit
8069b05da0
@ -3613,6 +3613,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. */
|
||||
@ -3650,7 +3681,6 @@ os_aio_simulated_handle(
|
||||
ibool ret;
|
||||
ulint n;
|
||||
ulint i;
|
||||
ulint len2;
|
||||
|
||||
segment = os_aio_get_array_and_local_segment(&array, global_segment);
|
||||
|
||||
@ -3857,33 +3887,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);
|
||||
|
@ -3431,6 +3431,8 @@ ha_innobase::index_prev(
|
||||
mysql_byte* buf) /* in/out: buffer for previous row in MySQL
|
||||
format */
|
||||
{
|
||||
statistic_increment(ha_read_prev_count, &LOCK_status);
|
||||
|
||||
return(general_fetch(buf, ROW_SEL_PREV, 0));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user