mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 19:37:16 +02:00
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
This commit is contained in:
parent
e5c36cbadc
commit
0f9a30ab86
2 changed files with 33 additions and 5 deletions
|
|
@ -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(
|
||||||
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 */
|
||||||
{
|
{
|
||||||
#ifdef HAVE_PWRITE
|
|
||||||
return(pwrite(file, buf, n, (off_t) offset));
|
|
||||||
#else
|
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
|
#ifdef HAVE_PWRITE
|
||||||
|
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
|
||||||
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(
|
||||||
|
|
||||||
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:
|
||||||
}
|
}
|
||||||
|
|
||||||
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(
|
||||||
|
|
||||||
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(
|
||||||
*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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue