Commit 26f9b9af authored by unknown's avatar unknown

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


innobase/buf/buf0rea.c:
  Fixed a recovery hang associated with ibuf bitmap pages
innobase/os/os0file.c:
  Always do fsync after a file write to reduce possibility of a partially written page in an OS crash
parent d3eb9d52
...@@ -73,11 +73,13 @@ buf_read_page_low( ...@@ -73,11 +73,13 @@ buf_read_page_low(
sync = TRUE; sync = TRUE;
} }
#endif #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 /* 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 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; sync = TRUE;
} }
......
...@@ -559,10 +559,18 @@ os_file_pwrite( ...@@ -559,10 +559,18 @@ os_file_pwrite(
ulint n, /* in: number of bytes to write */ ulint n, /* in: number of bytes to write */
ulint offset) /* in: offset where to write */ ulint offset) /* in: offset where to write */
{ {
ssize_t ret;
#ifdef HAVE_PWRITE #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 #else
ssize_t ret;
ulint i; ulint i;
/* Protect the seek / write operation with a mutex */ /* Protect the seek / write operation with a mutex */
...@@ -580,6 +588,11 @@ os_file_pwrite( ...@@ -580,6 +588,11 @@ os_file_pwrite(
ret = write(file, buf, n); 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]); os_mutex_exit(os_file_seek_mutexes[i]);
return(ret); return(ret);
...@@ -733,9 +746,14 @@ try_again: ...@@ -733,9 +746,14 @@ try_again:
} }
ret = WriteFile(file, buf, n, &len, NULL); 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]); os_mutex_exit(os_file_seek_mutexes[i]);
if (ret && len == n) { if (ret && len == n) {
return(TRUE); return(TRUE);
} }
...@@ -1497,6 +1515,10 @@ os_aio_windows_handle( ...@@ -1497,6 +1515,10 @@ os_aio_windows_handle(
if (ret && len == slot->len) { if (ret && len == slot->len) {
ret_val = TRUE; ret_val = TRUE;
if (slot->type == OS_FILE_WRITE) {
ut_a(TRUE == os_file_flush(slot->file));
}
} else { } else {
err = GetLastError(); err = GetLastError();
ut_error; ut_error;
...@@ -1578,6 +1600,10 @@ os_aio_posix_handle( ...@@ -1578,6 +1600,10 @@ os_aio_posix_handle(
*message1 = slot->message1; *message1 = slot->message1;
*message2 = slot->message2; *message2 = slot->message2;
if (slot->type == OS_FILE_WRITE) {
ut_a(TRUE == os_file_flush(slot->file));
}
os_mutex_exit(array->mutex); os_mutex_exit(array->mutex);
os_aio_array_free_slot(array, slot); os_aio_array_free_slot(array, slot);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment