diff options
author | Alberto Sartori <alberto.sartori@huawei.com> | 2023-07-13 13:20:59 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2023-07-13 17:21:10 +0200 |
commit | 771cf0eb75a8f910c9060599a188c1e770ecede0 (patch) | |
tree | 96503bfaf1d3319aa4b6575304331b9584bd1bb7 /src | |
parent | 67d6d25bde37c0a41f974ef3832cdfc73e4e9847 (diff) | |
download | justbuild-771cf0eb75a8f910c9060599a188c1e770ecede0.tar.gz |
bytestream_server: store temporary files under the local-buil-root
The bytestream server implementation (deployed by just execute) now
stores the temporary files under
$local_build_root/protocol-depenedent/generation-0
so that they can be garbage collected if "just exectue" is terminated
before they are cleaned up.
(cherry picked from ba28beba51ff7d495e5165471b96f7496bf585c2)
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/execution_api/execution_service/bytestream_server.cpp | 20 | ||||
-rw-r--r-- | src/buildtool/storage/local_cas.hpp | 4 |
2 files changed, 14 insertions, 10 deletions
diff --git a/src/buildtool/execution_api/execution_service/bytestream_server.cpp b/src/buildtool/execution_api/execution_service/bytestream_server.cpp index 234c4adc..b450c697 100644 --- a/src/buildtool/execution_api/execution_service/bytestream_server.cpp +++ b/src/buildtool/execution_api/execution_service/bytestream_server.cpp @@ -113,7 +113,14 @@ auto BytestreamServiceImpl::Write( *hash, request.write_offset(), request.finish_write()); - auto tmp_dir = TmpDir::Create("execution-service"); + auto lock = GarbageCollector::SharedLock(); + if (!lock) { + auto str = fmt::format("Could not acquire SharedLock"); + logger_.Emit(LogLevel::Error, str); + return grpc::Status{grpc::StatusCode::INTERNAL, str}; + } + auto tmp_dir = TmpDir::Create(StorageConfig::GenerationCacheRoot(0) / + "execution-service"); if (!tmp_dir) { return ::grpc::Status{::grpc::StatusCode::INTERNAL, "could not create TmpDir"}; @@ -129,21 +136,16 @@ auto BytestreamServiceImpl::Write( of.write(request.data().data(), static_cast<std::streamsize>(request.data().size())); } - auto lock = GarbageCollector::SharedLock(); - if (!lock) { - auto str = fmt::format("Could not acquire SharedLock"); - logger_.Emit(LogLevel::Error, str); - return grpc::Status{grpc::StatusCode::INTERNAL, str}; - } if (NativeSupport::IsTree(*hash)) { - if (not storage_->CAS().StoreTree(tmp)) { + if (not storage_->CAS().StoreTree</*kOwner=*/true>(tmp)) { auto str = fmt::format("could not store tree {}", *hash); logger_.Emit(LogLevel::Error, str); return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, str}; } } else { - if (not storage_->CAS().StoreBlob(tmp, /*is_executable=*/false)) { + if (not storage_->CAS().StoreBlob</*kOwner=*/true>( + tmp, /*is_executable=*/false)) { auto str = fmt::format("could not store blob {}", *hash); logger_.Emit(LogLevel::Error, str); return ::grpc::Status{::grpc::StatusCode::INVALID_ARGUMENT, str}; diff --git a/src/buildtool/storage/local_cas.hpp b/src/buildtool/storage/local_cas.hpp index af613b1d..4726f8b8 100644 --- a/src/buildtool/storage/local_cas.hpp +++ b/src/buildtool/storage/local_cas.hpp @@ -70,11 +70,13 @@ class LocalCAS { } /// \brief Store tree from file path. + /// \tparam kOwner Indicates ownership for optimization (hardlink). /// \param file_path The path of the file to store as tree. /// \returns Digest of the stored tree or nullopt otherwise. + template <bool kOwner = false> [[nodiscard]] auto StoreTree(std::filesystem::path const& file_path) const noexcept -> std::optional<bazel_re::Digest> { - return cas_tree_.StoreBlobFromFile(file_path); + return cas_tree_.StoreBlobFromFile(file_path, kOwner); } /// \brief Store tree from bytes. |