From 2c1ef0692b393014613bdf4af623c9dc487f613c Mon Sep 17 00:00:00 2001 From: Igor Canadi Date: Mon, 21 Apr 2014 17:45:04 -0700 Subject: [PATCH] Flush before Fsync()/Sync() Summary: Calling Fsync()/Sync() on a file should give the guarantee that whatever you written to the file is now persisted. This is currently not the case, since we might have some data left in application cache as we do Fsync()/Sync(). For example, BuildTable() calls Fsync() without the flush, assuming all sst data is now persisted, but it's actually not. This may result in big inconsistencies. Test Plan: no test Reviewers: sdong, dhruba, haobo, ljin, yhchiang Reviewed By: sdong CC: leveldb Differential Revision: https://reviews.facebook.net/D18159 --- util/env_posix.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/util/env_posix.cc b/util/env_posix.cc index bce9526a6..9e76a126d 100644 --- a/util/env_posix.cc +++ b/util/env_posix.cc @@ -761,6 +761,10 @@ class PosixWritableFile : public WritableFile { } virtual Status Sync() { + Status s = Flush(); + if (!s.ok()) { + return s; + } TEST_KILL_RANDOM(rocksdb_kill_odds); if (pending_sync_ && fdatasync(fd_) < 0) { return IOError(filename_, errno); @@ -771,6 +775,10 @@ class PosixWritableFile : public WritableFile { } virtual Status Fsync() { + Status s = Flush(); + if (!s.ok()) { + return s; + } TEST_KILL_RANDOM(rocksdb_kill_odds); if (pending_fsync_ && fsync(fd_) < 0) { return IOError(filename_, errno);