summaryrefslogtreecommitdiff
path: root/util/env.cc
diff options
context:
space:
mode:
authorSanjay Ghemawat <sanjay@google.com>2012-01-25 14:56:52 -0800
committerSanjay Ghemawat <sanjay@google.com>2012-01-25 14:56:52 -0800
commit3c8be108bfb5fbd7d51f824199627e757279f79e (patch)
treefa5fbe9ca451a385cf615f772cbcfeeb7c90e87a /util/env.cc
parentc8c5866a86c8d4a3e80d8708d14a06776fb683d1 (diff)
downloadleveldb-3c8be108bfb5fbd7d51f824199627e757279f79e.tar.gz
fixed issues 66 (leaking files on disk error) and 68 (no sync of CURRENT file)
Diffstat (limited to 'util/env.cc')
-rw-r--r--util/env.cc18
1 files changed, 16 insertions, 2 deletions
diff --git a/util/env.cc b/util/env.cc
index 594811b..c2600e9 100644
--- a/util/env.cc
+++ b/util/env.cc
@@ -33,14 +33,18 @@ void Log(Logger* info_log, const char* format, ...) {
}
}
-Status WriteStringToFile(Env* env, const Slice& data,
- const std::string& fname) {
+static Status DoWriteStringToFile(Env* env, const Slice& data,
+ const std::string& fname,
+ bool should_sync) {
WritableFile* file;
Status s = env->NewWritableFile(fname, &file);
if (!s.ok()) {
return s;
}
s = file->Append(data);
+ if (s.ok() && should_sync) {
+ s = file->Sync();
+ }
if (s.ok()) {
s = file->Close();
}
@@ -51,6 +55,16 @@ Status WriteStringToFile(Env* env, const Slice& data,
return s;
}
+Status WriteStringToFile(Env* env, const Slice& data,
+ const std::string& fname) {
+ return DoWriteStringToFile(env, data, fname, false);
+}
+
+Status WriteStringToFileSync(Env* env, const Slice& data,
+ const std::string& fname) {
+ return DoWriteStringToFile(env, data, fname, true);
+}
+
Status ReadFileToString(Env* env, const std::string& fname, std::string* data) {
data->clear();
SequentialFile* file;