mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
InnoDB: Do not flush after each write, not even when creating the
data files. Previously, writes were flushed until the doublewrite buffer was created. That would be too slow on systems where os_file_flush() [or fsync(2)] is slow. (Bug #12125) innobase/include/os0file.h: Disable os_do_not_call_flush_at_each_write unless #ifdef UNIV_DO_FLUSH innobase/os/os0file.c: Disable os_do_not_call_flush_at_each_write unless #ifdef UNIV_DO_FLUSH innobase/trx/trx0sys.c: Disable os_do_not_call_flush_at_each_write unless #ifdef UNIV_DO_FLUSH
This commit is contained in:
parent
6bac3d4309
commit
aee8de3527
3 changed files with 18 additions and 1 deletions
|
@ -17,7 +17,9 @@ Created 10/21/1995 Heikki Tuuri
|
|||
#include <time.h>
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_DO_FLUSH
|
||||
extern ibool os_do_not_call_flush_at_each_write;
|
||||
#endif /* UNIV_DO_FLUSH */
|
||||
extern ibool os_has_said_disk_full;
|
||||
extern ibool os_aio_print_debug;
|
||||
|
||||
|
|
|
@ -33,9 +33,13 @@ ulint os_innodb_umask = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
|
|||
ulint os_innodb_umask = 0;
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_DO_FLUSH
|
||||
/* If the following is set to TRUE, we do not call os_file_flush in every
|
||||
os_file_write. We can set this TRUE when the doublewrite buffer is used. */
|
||||
ibool os_do_not_call_flush_at_each_write = FALSE;
|
||||
#else
|
||||
/* We do not call os_file_flush in every os_file_write. */
|
||||
#endif /* UNIV_DO_FLUSH */
|
||||
|
||||
/* We use these mutexes to protect lseek + file i/o operation, if the
|
||||
OS does not provide an atomic pread or pwrite, or similar */
|
||||
|
@ -1974,6 +1978,7 @@ os_file_pwrite(
|
|||
os_file_n_pending_pwrites--;
|
||||
os_mutex_exit(os_file_count_mutex);
|
||||
|
||||
# ifdef UNIV_DO_FLUSH
|
||||
if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC
|
||||
&& srv_unix_file_flush_method != SRV_UNIX_NOSYNC
|
||||
&& !os_do_not_call_flush_at_each_write) {
|
||||
|
@ -1984,6 +1989,7 @@ os_file_pwrite(
|
|||
|
||||
ut_a(TRUE == os_file_flush(file));
|
||||
}
|
||||
# endif /* UNIV_DO_FLUSH */
|
||||
|
||||
return(ret);
|
||||
#else
|
||||
|
@ -2006,6 +2012,7 @@ os_file_pwrite(
|
|||
|
||||
ret = write(file, buf, (ssize_t)n);
|
||||
|
||||
# ifdef UNIV_DO_FLUSH
|
||||
if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC
|
||||
&& srv_unix_file_flush_method != SRV_UNIX_NOSYNC
|
||||
&& !os_do_not_call_flush_at_each_write) {
|
||||
|
@ -2016,6 +2023,7 @@ os_file_pwrite(
|
|||
|
||||
ut_a(TRUE == os_file_flush(file));
|
||||
}
|
||||
# endif /* UNIV_DO_FLUSH */
|
||||
|
||||
os_mutex_exit(os_file_seek_mutexes[i]);
|
||||
|
||||
|
@ -2282,9 +2290,11 @@ retry:
|
|||
/* Always do fsync to reduce the probability that when the OS crashes,
|
||||
a database page is only partially physically written to disk. */
|
||||
|
||||
# ifdef UNIV_DO_FLUSH
|
||||
if (!os_do_not_call_flush_at_each_write) {
|
||||
ut_a(TRUE == os_file_flush(file));
|
||||
}
|
||||
# endif /* UNIV_DO_FLUSH */
|
||||
|
||||
os_mutex_exit(os_file_seek_mutexes[i]);
|
||||
|
||||
|
@ -3498,10 +3508,12 @@ os_aio_windows_handle(
|
|||
if (ret && len == slot->len) {
|
||||
ret_val = TRUE;
|
||||
|
||||
# ifdef UNIV_DO_FLUSH
|
||||
if (slot->type == OS_FILE_WRITE
|
||||
&& !os_do_not_call_flush_at_each_write) {
|
||||
ut_a(TRUE == os_file_flush(slot->file));
|
||||
}
|
||||
# endif /* UNIV_DO_FLUSH */
|
||||
} else {
|
||||
os_file_handle_error(slot->name, "Windows aio");
|
||||
|
||||
|
@ -3582,10 +3594,12 @@ os_aio_posix_handle(
|
|||
*message1 = slot->message1;
|
||||
*message2 = slot->message2;
|
||||
|
||||
# ifdef UNIV_DO_FLUSH
|
||||
if (slot->type == OS_FILE_WRITE
|
||||
&& !os_do_not_call_flush_at_each_write) {
|
||||
ut_a(TRUE == os_file_flush(slot->file));
|
||||
}
|
||||
# endif /* UNIV_DO_FLUSH */
|
||||
|
||||
os_mutex_exit(array->mutex);
|
||||
|
||||
|
|
|
@ -97,8 +97,9 @@ trx_doublewrite_init(
|
|||
|
||||
/* Since we now start to use the doublewrite buffer, no need to call
|
||||
fsync() after every write to a data file */
|
||||
|
||||
#ifdef UNIV_DO_FLUSH
|
||||
os_do_not_call_flush_at_each_write = TRUE;
|
||||
#endif /* UNIV_DO_FLUSH */
|
||||
|
||||
mutex_create(&(trx_doublewrite->mutex));
|
||||
mutex_set_level(&(trx_doublewrite->mutex), SYNC_DOUBLEWRITE);
|
||||
|
|
Loading…
Reference in a new issue