diff options
author | Maksim Denisov <denisov.maksim@huawei.com> | 2025-02-25 11:46:51 +0100 |
---|---|---|
committer | Maksim Denisov <denisov.maksim@huawei.com> | 2025-02-27 09:03:30 +0100 |
commit | b3c6d3572784575811ff130d859e92b799e77bb3 (patch) | |
tree | dc37456d28fa9e464bdd50eb3218a6917c73e4be /src/buildtool/execution_api/local/local_api.cpp | |
parent | 9a987188a38cc18f6a485bd5def16aded10fe1f6 (diff) | |
download | justbuild-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.cpp | 16 |
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( |