summaryrefslogtreecommitdiff
path: root/innobase
diff options
context:
space:
mode:
authormarko@hundin.mysql.fi <>2005-07-26 14:03:34 +0300
committermarko@hundin.mysql.fi <>2005-07-26 14:03:34 +0300
commita89939c8e75e57015c8d6fa81330fb7fbc7f9ea4 (patch)
tree09a5b48dce49e89f224152a39b4b3fc2ec087521 /innobase
parentd3567611c61b1fb432f26e6e5fda6d7afadf6a5a (diff)
downloadmariadb-git-a89939c8e75e57015c8d6fa81330fb7fbc7f9ea4.tar.gz
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)
Diffstat (limited to 'innobase')
-rw-r--r--innobase/include/os0file.h2
-rw-r--r--innobase/os/os0file.c14
-rw-r--r--innobase/trx/trx0sys.c3
3 files changed, 18 insertions, 1 deletions
diff --git a/innobase/include/os0file.h b/innobase/include/os0file.h
index 63cd41a6d28..280a949c1c5 100644
--- a/innobase/include/os0file.h
+++ b/innobase/include/os0file.h
@@ -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;
diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c
index 4313b7f7019..49f88c0d62a 100644
--- a/innobase/os/os0file.c
+++ b/innobase/os/os0file.c
@@ -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);
diff --git a/innobase/trx/trx0sys.c b/innobase/trx/trx0sys.c
index 51e193d563b..c7292fb7650 100644
--- a/innobase/trx/trx0sys.c
+++ b/innobase/trx/trx0sys.c
@@ -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);