summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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.