From 0886f4f66a9313adca3cd7b4a87968a973bd6594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Gonz=C3=A1lez?= Date: Wed, 26 Aug 2015 15:28:09 +0200 Subject: [PATCH] Helper functions to support direct IO Summary: This patch adds the helper functions and variables to allow a backend implementing WritableFile to support direct IO when persisting a memtable. Test Plan: Since there is no upstream implementation of WritableFile supporting direct IO, the new behavior is disabled. Tests should be provided by the backend implementing WritableFile. --- include/rocksdb/env.h | 6 ++++++ util/file_reader_writer.cc | 4 ++-- util/file_reader_writer.h | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/rocksdb/env.h b/include/rocksdb/env.h index 54457853f..b606aea6b 100644 --- a/include/rocksdb/env.h +++ b/include/rocksdb/env.h @@ -457,6 +457,12 @@ class WritableFile { return false; } + // Indicates the upper layers if the current WritableFile implementation + // uses direct IO. + virtual bool UseDirectIO() const { + return false; + } + /* * Change the priority in rate limiter if rate limiting is enabled. * If rate limiting is not enabled, this call has no effect. diff --git a/util/file_reader_writer.cc b/util/file_reader_writer.cc index fb3fb8dfd..140969843 100644 --- a/util/file_reader_writer.cc +++ b/util/file_reader_writer.cc @@ -146,7 +146,7 @@ Status WritableFileWriter::Flush() { // the page. // Xfs does neighbor page flushing outside of the specified ranges. We // need to make sure sync range is far from the write offset. - if (bytes_per_sync_) { + if (!direct_io_ && bytes_per_sync_) { uint64_t kBytesNotSyncRange = 1024 * 1024; // recent 1MB is not synced. uint64_t kBytesAlignWhenSync = 4 * 1024; // Align 4KB. if (filesize_ > kBytesNotSyncRange) { @@ -170,7 +170,7 @@ Status WritableFileWriter::Sync(bool use_fsync) { return s; } TEST_KILL_RANDOM(rocksdb_kill_odds); - if (pending_sync_) { + if (!direct_io_ && pending_sync_) { s = SyncInternal(use_fsync); if (!s.ok()) { return s; diff --git a/util/file_reader_writer.h b/util/file_reader_writer.h index 873c0e29d..616d174a2 100644 --- a/util/file_reader_writer.h +++ b/util/file_reader_writer.h @@ -66,6 +66,7 @@ class WritableFileWriter { uint64_t filesize_; bool pending_sync_; bool pending_fsync_; + bool direct_io_; uint64_t last_sync_size_; uint64_t bytes_per_sync_; RateLimiter* rate_limiter_; @@ -80,6 +81,7 @@ class WritableFileWriter { filesize_(0), pending_sync_(false), pending_fsync_(false), + direct_io_(writable_file_->UseDirectIO()), last_sync_size_(0), bytes_per_sync_(options.bytes_per_sync), rate_limiter_(options.rate_limiter) {}