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,13 +72,28 @@ 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(); + 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(OS.error()); return llvm::errorCodeToError(OS.error()); } };