[PATCH] D55417: [clangd] Change diskbackedstorage to be atomic
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 7 01:45:39 PST 2018
kadircet updated this revision to Diff 177146.
kadircet added a comment.
- Fix returns
Repository:
rCTE Clang Tools Extra
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D55417/new/
https://reviews.llvm.org/D55417
Files:
clangd/index/BackgroundIndexStorage.cpp
Index: clangd/index/BackgroundIndexStorage.cpp
===================================================================
--- clangd/index/BackgroundIndexStorage.cpp
+++ clangd/index/BackgroundIndexStorage.cpp
@@ -9,6 +9,8 @@
#include "Logger.h"
#include "index/Background.h"
+#include "llvm/ADT/ScopeExit.h"
+#include "llvm/Support/Error.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
@@ -70,14 +72,29 @@
llvm::Error storeShard(llvm::StringRef ShardIdentifier,
IndexFileOut Shard) const override {
- auto ShardPath = getShardPathFromFilePath(DiskShardRoot, ShardIdentifier);
- std::error_code EC;
- llvm::raw_fd_ostream OS(ShardPath, EC);
+ // Write to a temporary file first.
+ llvm::SmallString<64> TempPath;
+ int FD;
+ auto EC = llvm::sys::fs::createTemporaryFile("clangd", "index-shard", FD,
+ TempPath);
if (EC)
return llvm::errorCodeToError(EC);
+ // Make sure temp file is destroyed at exit.
+ auto _ =
+ llvm::make_scope_exit([TempPath] { llvm::sys::fs::remove(TempPath); });
+ llvm::raw_fd_ostream OS(FD, true);
OS << Shard;
OS.close();
- return llvm::errorCodeToError(OS.error());
+ if (OS.has_error())
+ return llvm::errorCodeToError(OS.error());
+
+ // Then move to real location.
+ const auto ShardPath =
+ getShardPathFromFilePath(DiskShardRoot, ShardIdentifier);
+ EC = llvm::sys::fs::rename(TempPath, ShardPath);
+ if (EC)
+ return llvm::errorCodeToError(EC);
+ return llvm::ErrorSuccess();
}
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55417.177146.patch
Type: text/x-patch
Size: 1659 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181207/de2db933/attachment.bin>
More information about the cfe-commits
mailing list