summaryrefslogtreecommitdiff
path: root/src/buildtool/execution_api/local/local_api.cpp
diff options
context:
space:
mode:
authorMaksim Denisov <denisov.maksim@huawei.com>2025-02-25 11:46:51 +0100
committerMaksim Denisov <denisov.maksim@huawei.com>2025-02-27 09:03:30 +0100
commitb3c6d3572784575811ff130d859e92b799e77bb3 (patch)
treedc37456d28fa9e464bdd50eb3218a6917c73e4be /src/buildtool/execution_api/local/local_api.cpp
parent9a987188a38cc18f6a485bd5def16aded10fe1f6 (diff)
downloadjustbuild-b3c6d3572784575811ff130d859e92b799e77bb3.tar.gz
ArtifactBlob: Check access to the content
Diffstat (limited to 'src/buildtool/execution_api/local/local_api.cpp')
-rw-r--r--src/buildtool/execution_api/local/local_api.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/buildtool/execution_api/local/local_api.cpp b/src/buildtool/execution_api/local/local_api.cpp
index c9352d25..040b4be6 100644
--- a/src/buildtool/execution_api/local/local_api.cpp
+++ b/src/buildtool/execution_api/local/local_api.cpp
@@ -232,16 +232,22 @@ auto LocalApi::RetrieveToMemory(Artifact::ObjectInfo const& artifact_info)
auto LocalApi::Upload(std::unordered_set<ArtifactBlob>&& blobs,
bool /*skip_find_missing*/) const noexcept -> bool {
- return std::all_of(
+ // Blobs could have been received over the network, so a simple failure
+ // could result in lost traffic. Try add all blobs and fail if at least
+ // one is corrupted.
+ std::size_t const valid_count = std::count_if(
blobs.begin(),
blobs.end(),
[&cas = local_context_.storage->CAS()](ArtifactBlob const& blob) {
- auto const cas_digest =
- blob.GetDigest().IsTree()
- ? cas.StoreTree(*blob.ReadContent())
- : cas.StoreBlob(*blob.ReadContent(), blob.IsExecutable());
+ std::optional<ArtifactDigest> cas_digest;
+ if (auto const content = blob.ReadContent()) {
+ cas_digest = blob.GetDigest().IsTree()
+ ? cas.StoreTree(*content)
+ : cas.StoreBlob(*content, blob.IsExecutable());
+ }
return cas_digest and *cas_digest == blob.GetDigest();
});
+ return valid_count == blobs.size();
}
auto LocalApi::UploadTree(