summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Kosov <claprix@yandex.ru>2020-01-23 22:46:43 +0800
committerEugene Kosov <claprix@yandex.ru>2020-01-23 22:46:43 +0800
commit34dafb7e3a857b368323c7d1cd6966188cc1c977 (patch)
tree7ee53c8100311c98291f7685a753ce3657d5d2b2
parentb19760b8436c91c9333cc2744f238d45b993d366 (diff)
downloadmariadb-git-34dafb7e3a857b368323c7d1cd6966188cc1c977.tar.gz
redo log mics fixes
os_file_flush_data_func(): fix builds on POSIX OSs where fdatasync() is not avaiable log_t::files::flush_data_only(): rename from fdatasync() log_t::files::fsync(): removed and replaced with flush_data_only(). It will flush everything we need for using redo log files.
-rw-r--r--storage/innobase/handler/ha_innodb.cc2
-rw-r--r--storage/innobase/include/log0log.h4
-rw-r--r--storage/innobase/log/log0log.cc25
-rw-r--r--storage/innobase/os/os0file.cc2
-rw-r--r--storage/innobase/srv/srv0start.cc4
5 files changed, 9 insertions, 28 deletions
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 73aba96f741..56dc0087045 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -18614,7 +18614,7 @@ checkpoint_now_set(THD*, st_mysql_sys_var*, void*, const void* save)
? log_sys.append_on_checkpoint->size() : 0)
< log_sys.lsn) {
log_make_checkpoint();
- log_sys.log.fdatasync();
+ log_sys.log.flush_data_only();
}
dberr_t err = fil_write_flushed_lsn(log_sys.lsn);
diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h
index 71602056e16..4e619a203d9 100644
--- a/storage/innobase/include/log0log.h
+++ b/storage/innobase/include/log0log.h
@@ -553,10 +553,8 @@ struct log_t{
@param[in] total_offset offset in log files treated as a single file
@param[in] buf buffer from which to write */
void write(size_t total_offset, span<byte> buf);
- /** flushes OS page cache for all log files */
- void fsync();
/** flushes OS page cache (excluding metadata!) for all log files */
- void fdatasync();
+ void flush_data_only();
/** closes all log files */
void close_files();
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc
index 752dc488ec9..d0b325c05aa 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -641,24 +641,7 @@ void log_t::files::write(size_t total_offset, span<byte> buf)
}
}
-void log_t::files::fsync()
-{
- ut_ad(files.size() == file_names.size());
-
- log_sys.pending_flushes.fetch_add(1, std::memory_order_acquire);
- for (auto it= files.begin(), end= files.end(); it != end; ++it)
- {
- if (!os_file_flush(*it))
- {
- const auto idx= std::distance(files.begin(), it);
- ib::fatal() << "os_file_flush(" << file_names[idx] << ") failed";
- }
- }
- log_sys.pending_flushes.fetch_sub(1, std::memory_order_release);
- log_sys.flushes.fetch_add(1, std::memory_order_release);
-}
-
-void log_t::files::fdatasync()
+void log_t::files::flush_data_only()
{
ut_ad(files.size() == file_names.size());
@@ -880,7 +863,7 @@ log_write_flush_to_disk_low()
calling os_event_set()! */
ut_a(log_sys.n_pending_flushes == 1); /* No other threads here */
- log_sys.log.fdatasync();
+ log_sys.log.flush_data_only();
log_mutex_enter();
log_sys.flushed_to_disk_lsn = log_sys.current_flush_lsn;
@@ -1307,7 +1290,7 @@ void log_write_checkpoint_info(lsn_t end_lsn)
: LOG_CHECKPOINT_1,
{buf, OS_FILE_LOG_BLOCK_SIZE});
- log_sys.log.fdatasync();
+ log_sys.log.flush_data_only();
log_mutex_enter();
@@ -1785,7 +1768,7 @@ wait_suspend_loop:
/* Ensure that all buffered changes are written to the
redo log before fil_close_all_files(). */
- log_sys.log.fdatasync();
+ log_sys.log.flush_data_only();
} else {
lsn = srv_start_lsn;
}
diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc
index fde32c822e1..7cf1cbea60d 100644
--- a/storage/innobase/os/os0file.cc
+++ b/storage/innobase/os/os0file.cc
@@ -4626,7 +4626,7 @@ os_normalize_path(
}
bool os_file_flush_data_func(os_file_t file) {
-#ifdef _WIN32
+#if defined(_WIN32) || !defined(HAVE_FDATASYNC) || HAVE_DECL_FDATASYNC == 0
return os_file_flush_func(file);
#else
bool success= fdatasync(file) != -1;
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index caa864b6e0b..d60e3d088ad 100644
--- a/storage/innobase/srv/srv0start.cc
+++ b/storage/innobase/srv/srv0start.cc
@@ -421,7 +421,7 @@ MY_ATTRIBUTE((warn_unused_result, nonnull))
static dberr_t create_log_files_rename(char *logfilename, size_t dirnamelen,
lsn_t lsn, std::string &logfile0)
{
- log_sys.log.fsync();
+ log_sys.log.flush_data_only();
ut_ad(!srv_log_files_created);
ut_d(srv_log_files_created= true);
@@ -1132,7 +1132,7 @@ srv_prepare_to_delete_redo_log_files(
log_write_up_to(flushed_lsn, true);
- log_sys.log.fsync();
+ log_sys.log.flush_data_only();
ut_ad(flushed_lsn == log_get_lsn());