From daca274041e31636f08927b0cebc56fd33c7bbdf Mon Sep 17 00:00:00 2001 From: Oliver Reiche Date: Thu, 7 Jul 2022 17:28:29 +0200 Subject: LocalExecution: Use Git tree format - LocalStorage Add tree CAS and support reading Git trees - LocalAction: Create Git tree for output directory - LocalApi: Support availability and upload of Git trees - LocalStorage: Support dumping tree to stream in native mode --- src/buildtool/execution_api/local/local_api.hpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/buildtool/execution_api/local/local_api.hpp') diff --git a/src/buildtool/execution_api/local/local_api.hpp b/src/buildtool/execution_api/local/local_api.hpp index c1cb1c57..1a43fe4b 100644 --- a/src/buildtool/execution_api/local/local_api.hpp +++ b/src/buildtool/execution_api/local/local_api.hpp @@ -7,6 +7,7 @@ #include #include "gsl-lite/gsl-lite.hpp" +#include "src/buildtool/compatibility/native_support.hpp" #include "src/buildtool/execution_api/bazel_msg/bazel_blob.hpp" #include "src/buildtool/execution_api/common/execution_api.hpp" #include "src/buildtool/execution_api/common/local_tree_map.hpp" @@ -75,7 +76,7 @@ class LocalApi final : public IExecutionApi { [[nodiscard]] auto RetrieveToFds( std::vector const& artifacts_info, std::vector const& fds, - bool /*raw_tree*/) noexcept -> bool final { + bool raw_tree) noexcept -> bool final { if (artifacts_info.size() != fds.size()) { Logger::Log(LogLevel::Error, "different number of digests and file descriptors."); @@ -87,7 +88,8 @@ class LocalApi final : public IExecutionApi { auto const& info = artifacts_info[i]; if (gsl::owner out = fdopen(fd, "wb")) { // NOLINT - auto const success = storage_->DumpToStream(info, out); + auto const success = + storage_->DumpToStream(info, out, raw_tree); std::fclose(out); if (not success) { Logger::Log(LogLevel::Error, @@ -112,7 +114,9 @@ class LocalApi final : public IExecutionApi { bool /*skip_find_missing*/) noexcept -> bool final { for (auto const& blob : blobs) { - auto cas_digest = storage_->StoreBlob(blob.data); + auto const is_tree = NativeSupport::IsTree(blob.digest.hash()); + auto cas_digest = is_tree ? storage_->StoreTree(blob.data) + : storage_->StoreBlob(blob.data); if (not cas_digest or not std::equal_to{}( *cas_digest, blob.digest)) { return false; @@ -148,7 +152,9 @@ class LocalApi final : public IExecutionApi { [[nodiscard]] auto IsAvailable(ArtifactDigest const& digest) const noexcept -> bool final { - return storage_->BlobPath(digest, false).has_value(); + return static_cast(digest.is_tree() + ? storage_->TreePath(digest) + : storage_->BlobPath(digest, false)); } [[nodiscard]] auto IsAvailable(std::vector const& digests) -- cgit v1.2.3