diff options
author | Sascha Roloff <sascha.roloff@huawei.com> | 2024-02-23 16:04:36 +0100 |
---|---|---|
committer | Sascha Roloff <sascha.roloff@huawei.com> | 2024-02-26 17:16:21 +0100 |
commit | 0d98a04c28eeb18d08f731c3f94de825d49daac5 (patch) | |
tree | 8218dcfca1fb1c9dca5da6a1afd5c30677788726 /src/buildtool/execution_api/execution_service/cas_utils.cpp | |
parent | 25ef9672988f008e61193228756dcfed069bda57 (diff) | |
download | justbuild-0d98a04c28eeb18d08f731c3f94de825d49daac5.tar.gz |
Implement blob splicing protocol at just server side
Diffstat (limited to 'src/buildtool/execution_api/execution_service/cas_utils.cpp')
-rw-r--r-- | src/buildtool/execution_api/execution_service/cas_utils.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/buildtool/execution_api/execution_service/cas_utils.cpp b/src/buildtool/execution_api/execution_service/cas_utils.cpp index 48bbd124..b710dd36 100644 --- a/src/buildtool/execution_api/execution_service/cas_utils.cpp +++ b/src/buildtool/execution_api/execution_service/cas_utils.cpp @@ -145,7 +145,8 @@ auto CASUtils::SplitBlobFastCDC(bazel_re::Digest const& blob_digest, auto CASUtils::SpliceBlob(bazel_re::Digest const& blob_digest, std::vector<bazel_re::Digest> const& chunk_digests, - Storage const& storage) noexcept + Storage const& storage, + bool check_tree_invariant) noexcept -> std::variant<bazel_re::Digest, grpc::Status> { // Assemble blob from chunks. @@ -175,6 +176,20 @@ auto CASUtils::SpliceBlob(bazel_re::Digest const& blob_digest, // Store resulting blob in according CAS. auto const& hash = blob_digest.hash(); if (NativeSupport::IsTree(hash)) { + // In native mode: for trees, check whether the tree invariant holds + // before storing the actual tree object. + if (check_tree_invariant) { + auto tree_data = FileSystemManager::ReadFile(tmp_file); + if (not tree_data) { + return grpc::Status{ + grpc::StatusCode::INTERNAL, + fmt::format("could read tree data {}", hash)}; + } + if (auto err = EnsureTreeInvariant(*tree_data, hash, storage)) { + return grpc::Status{grpc::StatusCode::FAILED_PRECONDITION, + *err}; + } + } auto const& digest = storage.CAS().StoreTree</* kOwner= */ true>(tmp_file); if (not digest) { |