summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlberto Sartori <alberto.sartori@huawei.com>2023-07-13 13:20:59 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2023-07-13 17:21:10 +0200
commit771cf0eb75a8f910c9060599a188c1e770ecede0 (patch)
tree96503bfaf1d3319aa4b6575304331b9584bd1bb7 /src
parent67d6d25bde37c0a41f974ef3832cdfc73e4e9847 (diff)
downloadjustbuild-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.cpp20
-rw-r--r--src/buildtool/storage/local_cas.hpp4
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.