summaryrefslogtreecommitdiff
path: root/src/buildtool/execution_api/execution_service/cas_utils.cpp
diff options
context:
space:
mode:
authorSascha Roloff <sascha.roloff@huawei.com>2024-02-23 16:04:36 +0100
committerSascha Roloff <sascha.roloff@huawei.com>2024-02-26 17:16:21 +0100
commit0d98a04c28eeb18d08f731c3f94de825d49daac5 (patch)
tree8218dcfca1fb1c9dca5da6a1afd5c30677788726 /src/buildtool/execution_api/execution_service/cas_utils.cpp
parent25ef9672988f008e61193228756dcfed069bda57 (diff)
downloadjustbuild-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.cpp17
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) {