diff options
5 files changed, 22 insertions, 44 deletions
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp index 179ac0db..2a9fc182 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp @@ -427,19 +427,26 @@ auto BazelCasClient::BlobSpliceSupport( auto BazelCasClient::FindMissingBlobs( std::string const& instance_name, - std::unordered_set<bazel_re::Digest> const& digests) const noexcept - -> std::unordered_set<bazel_re::Digest> { - std::unordered_set<bazel_re::Digest> result; + std::unordered_set<ArtifactDigest> const& digests) const noexcept + -> std::unordered_set<ArtifactDigest> { + std::unordered_set<ArtifactDigest> result; if (digests.empty()) { return result; } + + auto const back_map = BackMap<bazel_re::Digest, ArtifactDigest>::Make( + &digests, ArtifactDigestFactory::ToBazel); + if (not back_map.has_value()) { + return digests; + } + try { result.reserve(digests.size()); auto requests = CreateBatchRequestsMaxSize<bazel_re::FindMissingBlobsRequest>( instance_name, - digests.begin(), - digests.end(), + back_map->GetKeys().begin(), + back_map->GetKeys().end(), "FindMissingBlobs", [](bazel_re::FindMissingBlobsRequest* request, bazel_re::Digest const& x) { @@ -456,10 +463,11 @@ auto BazelCasClient::FindMissingBlobs( retry_config_, logger_); if (ok) { - auto batch = - ProcessResponseContents<bazel_re::Digest>(response); - for (auto&& x : batch) { - result.emplace(std::move(x)); + for (auto& batch : + ProcessResponseContents<bazel_re::Digest>(response)) { + if (auto value = back_map->GetReference(batch)) { + result.emplace(*value.value()); + } } } else { diff --git a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp index 370bb7ca..279164bf 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp @@ -55,8 +55,8 @@ class BazelCasClient { /// \returns The digests of blobs not found in CAS [[nodiscard]] auto FindMissingBlobs( std::string const& instance_name, - std::unordered_set<bazel_re::Digest> const& digests) const noexcept - -> std::unordered_set<bazel_re::Digest>; + std::unordered_set<ArtifactDigest> const& digests) const noexcept + -> std::unordered_set<ArtifactDigest>; /// \brief Upload multiple blobs in batch transfer /// \param[in] instance_name Name of the CAS instance diff --git a/src/buildtool/execution_api/remote/bazel/bazel_network.cpp b/src/buildtool/execution_api/remote/bazel/bazel_network.cpp index b435fb8e..0be8b539 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_network.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_network.cpp @@ -17,7 +17,6 @@ #include <functional> #include <utility> -#include "src/buildtool/common/artifact_digest_factory.hpp" #include "src/buildtool/execution_api/common/content_blob_container.hpp" #include "src/buildtool/execution_api/common/message_limits.hpp" #include "src/buildtool/logging/log_level.hpp" @@ -44,23 +43,13 @@ BazelNetwork::BazelNetwork( auto BazelNetwork::IsAvailable(ArtifactDigest const& digest) const noexcept -> bool { - return cas_ - ->FindMissingBlobs(instance_name_, - {ArtifactDigestFactory::ToBazel(digest)}) - .empty(); + return cas_->FindMissingBlobs(instance_name_, {digest}).empty(); } auto BazelNetwork::FindMissingBlobs( std::unordered_set<ArtifactDigest> const& digests) const noexcept -> std::unordered_set<ArtifactDigest> { - auto const back_map = BackMap<bazel_re::Digest, ArtifactDigest>::Make( - &digests, ArtifactDigestFactory::ToBazel); - if (not back_map.has_value()) { - return digests; - } - auto missing_digests = - cas_->FindMissingBlobs(instance_name_, back_map->GetKeys()); - return back_map->GetValues(missing_digests); + return cas_->FindMissingBlobs(instance_name_, digests); } auto BazelNetwork::SplitBlob(bazel_re::Digest const& blob_digest) const noexcept diff --git a/test/buildtool/execution_api/bazel/TARGETS b/test/buildtool/execution_api/bazel/TARGETS index 88915e7e..84676f67 100644 --- a/test/buildtool/execution_api/bazel/TARGETS +++ b/test/buildtool/execution_api/bazel/TARGETS @@ -6,8 +6,6 @@ [ ["@", "catch2", "", "catch2"] , ["@", "gsl", "", "gsl"] , ["@", "src", "src/buildtool/common", "artifact_digest_factory"] - , ["@", "src", "src/buildtool/common", "bazel_digest_factory"] - , ["@", "src", "src/buildtool/common", "bazel_types"] , ["@", "src", "src/buildtool/common", "common"] , ["@", "src", "src/buildtool/common/remote", "remote_common"] , ["@", "src", "src/buildtool/common/remote", "retry_config"] diff --git a/test/buildtool/execution_api/bazel/bazel_cas_client.test.cpp b/test/buildtool/execution_api/bazel/bazel_cas_client.test.cpp index 606212a6..503561cf 100644 --- a/test/buildtool/execution_api/bazel/bazel_cas_client.test.cpp +++ b/test/buildtool/execution_api/bazel/bazel_cas_client.test.cpp @@ -24,8 +24,6 @@ #include "gsl/gsl" #include "src/buildtool/common/artifact_digest.hpp" #include "src/buildtool/common/artifact_digest_factory.hpp" -#include "src/buildtool/common/bazel_digest_factory.hpp" -#include "src/buildtool/common/bazel_types.hpp" #include "src/buildtool/common/remote/remote_common.hpp" #include "src/buildtool/common/remote/retry_config.hpp" #include "src/buildtool/crypto/hash_function.hpp" @@ -59,15 +57,12 @@ TEST_CASE("Bazel internals: CAS Client", "[execution_api]") { HashFunction const hash_function{TestHashType::ReadFromEnvironment()}; auto const digest = ArtifactDigestFactory::HashDataAs<ObjectType::File>( hash_function, content); - auto bazel_digest = BazelDigestFactory::HashDataAs<ObjectType::File>( - hash_function, content); // Valid blob ArtifactBlob blob{digest, content, /*is_exec=*/false}; // Search blob via digest - auto digests = - cas_client.FindMissingBlobs(instance_name, {bazel_digest}); + auto digests = cas_client.FindMissingBlobs(instance_name, {digest}); CHECK(digests.size() <= 1); if (not digests.empty()) { @@ -81,16 +76,4 @@ TEST_CASE("Bazel internals: CAS Client", "[execution_api]") { CHECK(blobs.begin()->digest == digest); CHECK(*blobs.begin()->data == content); } - - SECTION("Invalid digest and blob") { - // Faulty digest - bazel_re::Digest faulty_digest{}; - faulty_digest.set_hash( - "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"); - faulty_digest.set_size_bytes(4); - - // Search faulty digest - CHECK(cas_client.FindMissingBlobs(instance_name, {faulty_digest}) - .size() == 1); - } } |