Commit 8069b05d authored by unknown's avatar unknown
Browse files

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().
parent 1bdb7f77
Loading
Loading
Loading
Loading
+38 −25
Original line number Diff line number Diff line
@@ -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);
	
@@ -3858,32 +3888,15 @@ os_aio_simulated_handle(
				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);
+2 −0
Original line number Diff line number Diff line
@@ -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));
}