summaryrefslogtreecommitdiff
path: root/innobase
diff options
context:
space:
mode:
authorunknown <aivanov@mysql.com>2006-05-15 17:25:37 +0400
committerunknown <aivanov@mysql.com>2006-05-15 17:25:37 +0400
commit8069b05da0b23e5bcc3c410f7ee4669afea41714 (patch)
treef54674fcbbf1ecf0aa64967e4671fd5034e0f767 /innobase
parent1bdb7f7789f4c1b02a97210e3818d49f6e064bc2 (diff)
downloadmariadb-git-8069b05da0b23e5bcc3c410f7ee4669afea41714.tar.gz
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().
Diffstat (limited to 'innobase')
-rw-r--r--innobase/os/os0file.c63
1 files changed, 38 insertions, 25 deletions
diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c
index 6ef6f7cd545..4c90c95c0bd 100644
--- a/innobase/os/os0file.c
+++ b/innobase/os/os0file.c
@@ -3614,6 +3614,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);