Chromium Code Reviews| Index: third_party/leveldatabase/env_chromium.cc |
| diff --git a/third_party/leveldatabase/env_chromium.cc b/third_party/leveldatabase/env_chromium.cc |
| index 3088786f61b0e5c98b2618a22dc4d832c722689b..36ac793fff1c0f9bf3c1fc07adfaae2433028f42 100644 |
| --- a/third_party/leveldatabase/env_chromium.cc |
| +++ b/third_party/leveldatabase/env_chromium.cc |
| @@ -30,6 +30,10 @@ |
| #include "base/win/win_util.h" |
| #endif |
| +#if !defined(OS_WIN) |
| +#include <fcntl.h> |
|
dgrogan
2012/12/06 23:17:38
Oh yeah, what's this for?
ericu
2012/12/10 18:31:12
O_WRONLY
|
| +#endif |
| + |
| namespace { |
| #if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_ANDROID) || \ |
| @@ -66,19 +70,8 @@ FILE* fopen_internal(const char* fname, const char* mode) { |
| return _wfopen(UTF8ToUTF16(fname).c_str(), ASCIIToUTF16(mode).c_str()); |
| #else |
| return fopen(fname, mode); |
| -#endif |
| } |
|
dgrogan
2012/12/06 23:15:41
This won't compile on windows, will it?
ericu
2012/12/10 18:31:12
Fixed. However, I'm having trouble uploading a ne
dgrogan
2012/12/10 21:53:46
Editing it here should work, env_chromium.cc lives
|
| - |
| -} // namespace |
| - |
| -namespace leveldb { |
| - |
| -namespace { |
| - |
| -class Thread; |
| - |
| -static const ::FilePath::CharType kLevelDBTestDirectoryPrefix[] |
| - = FILE_PATH_LITERAL("leveldb-test-"); |
| +#endif |
| ::FilePath CreateFilePath(const std::string& file_path) { |
| #if defined(OS_WIN) |
| @@ -96,6 +89,29 @@ std::string FilePathToString(const ::FilePath& file_path) { |
| #endif |
| } |
| +bool sync_parent(const std::string& fname) { |
| +#if !defined(OS_WIN) |
| + FilePath parent_dir = CreateFilePath(fname).DirName(); |
| + int parent_fd = open(FilePathToString(parent_dir).c_str(), O_WRONLY); |
| + if (parent_fd < 0) |
| + return false; |
| + fsync(parent_fd); |
| + close(parent_fd); |
| +#endif |
| + return true; |
| +} |
| + |
| +} // namespace |
| + |
| +namespace leveldb { |
| + |
| +namespace { |
| + |
| +class Thread; |
| + |
| +static const ::FilePath::CharType kLevelDBTestDirectoryPrefix[] |
| + = FILE_PATH_LITERAL("leveldb-test-"); |
| + |
| // TODO(jorlow): This should be moved into Chromium's base. |
| const char* PlatformFileErrorString(const ::base::PlatformFileError& error) { |
| switch (error) { |
| @@ -290,6 +306,10 @@ class ChromiumEnv : public Env { |
| if (f == NULL) { |
| return Status::IOError(fname, strerror(errno)); |
| } else { |
| + if (!sync_parent(fname)) { |
| + fclose(f); |
| + return Status::IOError(fname, strerror(errno)); |
| + } |
| *result = new ChromiumWritableFile(fname, f); |
| return Status::OK(); |
| } |
| @@ -357,6 +377,10 @@ class ChromiumEnv : public Env { |
| Status result; |
| if (!::file_util::ReplaceFile(CreateFilePath(src), CreateFilePath(dst))) { |
| result = Status::IOError(src, "Could not rename file."); |
| + } else { |
| + sync_parent(dst); |
|
dgrogan
2012/12/06 23:15:41
Was ignoring the return value an oversight or cons
ericu
2012/12/10 18:31:12
Conscious choice. There's nothing we can do about
|
| + if (src != dst) |
| + sync_parent(src); |
| } |
| return result; |
| } |
| @@ -430,6 +454,10 @@ class ChromiumEnv : public Env { |
| *result = NULL; |
| return Status::IOError(fname, strerror(errno)); |
| } else { |
| + if (!sync_parent(fname)) { |
| + fclose(f); |
| + return Status::IOError(fname, strerror(errno)); |
| + } |
| *result = new ChromiumLogger(f); |
| return Status::OK(); |
| } |