Commit 0f9a30ab authored by heikki@donna.mysql.fi's avatar heikki@donna.mysql.fi
Browse files

os0file.c Always do fsync after a file write to reduce possibility of a...

os0file.c	Always do fsync after a file write to reduce possibility of a partially written page in an OS crash
buf0rea.c	Fixed a recovery hang associated with ibuf bitmap pages
parent e5c36cba
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -73,11 +73,13 @@ buf_read_page_low(
		sync = TRUE;
	}
#endif
	if (trx_sys_hdr_page(space, offset)) {
	if (ibuf_bitmap_page(offset) || trx_sys_hdr_page(space, offset)) {

		/* Trx sys header is so low in the latching order that we play
		safe and do not leave the i/o-completion to an asynchronous
		i/o-thread: */
		i/o-thread. Ibuf bitmap pages must always be read with
                syncronous i/o, to make sure they do not get involved in
                thread deadlocks. */
		
		sync = TRUE;
	}
+29 −3
Original line number Diff line number Diff line
@@ -559,10 +559,18 @@ os_file_pwrite(
	ulint		n,	/* in: number of bytes to write */	
	ulint		offset)	/* in: offset where to write */
{
	ssize_t	ret;

#ifdef HAVE_PWRITE
	return(pwrite(file, buf, n, (off_t) offset));
	ret = pwrite(file, buf, n, (off_t) offset);

	/* Always do fsync to reduce the probability that when the OS crashes,
	a database page is only partially physically written to disk. */

	ut_a(TRUE == os_file_flush(file));

        return(ret);
#else
	ssize_t	ret;
	ulint	i;

	/* Protect the seek / write operation with a mutex */
@@ -580,6 +588,11 @@ os_file_pwrite(
	
	ret = write(file, buf, n);

	/* Always do fsync to reduce the probability that when the OS crashes,
	a database page is only partially physically written to disk. */

	ut_a(TRUE == os_file_flush(file));

	os_mutex_exit(os_file_seek_mutexes[i]);

	return(ret);
@@ -734,6 +747,11 @@ os_file_write(

	ret = WriteFile(file, buf, n, &len, NULL);
	
	/* Always do fsync to reduce the probability that when the OS crashes,
	a database page is only partially physically written to disk. */

	ut_a(TRUE == os_file_flush(file));

	os_mutex_exit(os_file_seek_mutexes[i]);

	if (ret && len == n) {
@@ -1497,6 +1515,10 @@ os_aio_windows_handle(

	if (ret && len == slot->len) {
		ret_val = TRUE;

		if (slot->type == OS_FILE_WRITE) {
		         ut_a(TRUE == os_file_flush(slot->file));
		}
	} else {
		err = GetLastError();
		ut_error;
@@ -1578,6 +1600,10 @@ os_aio_posix_handle(
	*message1 = slot->message1;
	*message2 = slot->message2;

	if (slot->type == OS_FILE_WRITE) {
		ut_a(TRUE == os_file_flush(slot->file));
	}

	os_mutex_exit(array->mutex);

	os_aio_array_free_slot(array, slot);