From 309ec18cc97554b46962cadd55c9f5a1f114c286 Mon Sep 17 00:00:00 2001 From: Maksim Denisov Date: Tue, 28 Jan 2025 11:09:11 +0100 Subject: BazelCasClient: Use unordered_set in FindMissingBlobs --- src/buildtool/execution_api/remote/TARGETS | 1 + .../execution_api/remote/bazel/bazel_api.cpp | 27 +++++++++------------- .../remote/bazel/bazel_cas_client.cpp | 12 +++++----- .../remote/bazel/bazel_cas_client.hpp | 9 ++++---- .../execution_api/remote/bazel/bazel_network.cpp | 16 ++++++------- .../execution_api/remote/bazel/bazel_network.hpp | 6 +++-- 6 files changed, 35 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/buildtool/execution_api/remote/TARGETS b/src/buildtool/execution_api/remote/TARGETS index 3b77f444..f61324bd 100644 --- a/src/buildtool/execution_api/remote/TARGETS +++ b/src/buildtool/execution_api/remote/TARGETS @@ -97,6 +97,7 @@ , ["src/buildtool/logging", "log_level"] , ["src/buildtool/logging", "logging"] , ["src/buildtool/multithreading", "task_system"] + , ["src/utils/cpp", "back_map"] , ["src/utils/cpp", "expected"] , ["src/utils/cpp", "transformed_range"] ] diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp index 3a5fd860..f1d06429 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp @@ -49,6 +49,7 @@ #include "src/buildtool/logging/log_level.hpp" #include "src/buildtool/logging/logger.hpp" #include "src/buildtool/multithreading/task_system.hpp" +#include "src/utils/cpp/back_map.hpp" #include "src/utils/cpp/expected.hpp" #include "src/utils/cpp/transformed_range.hpp" @@ -602,23 +603,17 @@ auto BazelApi::CreateAction( [[nodiscard]] auto BazelApi::IsAvailable( std::vector const& digests) const noexcept -> std::vector { - std::vector bazel_digests; - bazel_digests.reserve(digests.size()); - std::unordered_map digest_map; - for (auto const& digest : digests) { - auto const& bazel_digest = - bazel_digests.emplace_back(ArtifactDigestFactory::ToBazel(digest)); - digest_map.insert_or_assign(bazel_digest, &digest); - } - auto const bazel_result = network_->IsAvailable(bazel_digests); - std::vector result; - result.reserve(bazel_result.size()); - for (auto const& bazel_digest : bazel_result) { - auto it = digest_map.find(bazel_digest); - if (it != digest_map.end()) { - result.push_back(*it->second); - } + auto const back_map = BackMap::Make( + &digests, ArtifactDigestFactory::ToBazel); + if (not back_map.has_value()) { + return digests; } + + auto const bazel_result = network_->IsAvailable(back_map->GetKeys()); + auto missing = back_map->GetValues(bazel_result); + std::vector result; + result.reserve(missing.size()); + std::move(missing.begin(), missing.end(), std::back_inserter(result)); return result; } 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 9c3fb23c..dff23491 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp @@ -187,14 +187,14 @@ BazelCasClient::BazelCasClient( auto BazelCasClient::FindMissingBlobs( std::string const& instance_name, - std::vector const& digests) const noexcept - -> std::vector { + std::unordered_set const& digests) const noexcept + -> std::unordered_set { return FindMissingBlobs(instance_name, digests.begin(), digests.end()); } auto BazelCasClient::FindMissingBlobs(std::string const& instance_name, BazelBlobContainer const& blob_container) - const noexcept -> std::vector { + const noexcept -> std::unordered_set { auto digests_range = blob_container.Digests(); return FindMissingBlobs( instance_name, digests_range.begin(), digests_range.end()); @@ -430,8 +430,8 @@ template auto BazelCasClient::FindMissingBlobs(std::string const& instance_name, TForwardIter const& start, TForwardIter const& end) const noexcept - -> std::vector { - std::vector result; + -> std::unordered_set { + std::unordered_set result; if (start == end) { return result; } @@ -461,7 +461,7 @@ auto BazelCasClient::FindMissingBlobs(std::string const& instance_name, auto batch = ProcessResponseContents(response); for (auto&& x : batch) { - result.emplace_back(std::move(x)); + result.emplace(std::move(x)); } } 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 eca24d9c..ad3210f4 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -53,8 +54,8 @@ class BazelCasClient { /// \returns The digests of blobs not found in CAS [[nodiscard]] auto FindMissingBlobs( std::string const& instance_name, - std::vector const& digests) const noexcept - -> std::vector; + std::unordered_set const& digests) const noexcept + -> std::unordered_set; /// \brief Find missing blobs /// \param[in] instance_name Name of the CAS instance @@ -63,7 +64,7 @@ class BazelCasClient { [[nodiscard]] auto FindMissingBlobs( std::string const& instance_name, BazelBlobContainer const& blob_container) const noexcept - -> std::vector; + -> std::unordered_set; /// \brief Upload multiple blobs in batch transfer /// \param[in] instance_name Name of the CAS instance @@ -162,7 +163,7 @@ class BazelCasClient { [[nodiscard]] auto FindMissingBlobs(std::string const& instance_name, TOutputIter const& start, TOutputIter const& end) const noexcept - -> std::vector; + -> std::unordered_set; template [[nodiscard]] auto CreateBatchRequestsMaxSize( diff --git a/src/buildtool/execution_api/remote/bazel/bazel_network.cpp b/src/buildtool/execution_api/remote/bazel/bazel_network.cpp index a78f8081..eb18a858 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_network.cpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_network.cpp @@ -15,8 +15,8 @@ #include "src/buildtool/execution_api/remote/bazel/bazel_network.hpp" #include +#include #include -#include #include #include "src/buildtool/execution_api/common/message_limits.hpp" @@ -44,14 +44,12 @@ BazelNetwork::BazelNetwork( auto BazelNetwork::IsAvailable(bazel_re::Digest const& digest) const noexcept -> bool { - return cas_ - ->FindMissingBlobs(instance_name_, - std::vector{digest}) - .empty(); + return cas_->FindMissingBlobs(instance_name_, {digest}).empty(); } -auto BazelNetwork::IsAvailable(std::vector const& digests) - const noexcept -> std::vector { +auto BazelNetwork::IsAvailable( + std::unordered_set const& digests) const noexcept + -> std::unordered_set { return cas_->FindMissingBlobs(instance_name_, digests); } @@ -118,7 +116,9 @@ auto BazelNetwork::UploadBlobs(BazelBlobContainer&& blobs, } // find digests of blobs missing in CAS - auto missing_digests = cas_->FindMissingBlobs(instance_name_, blobs); + auto missing_digests_set = cas_->FindMissingBlobs(instance_name_, blobs); + std::vector missing_digests(missing_digests_set.begin(), + missing_digests_set.end()); if (not missing_digests.empty()) { // update missing blobs diff --git a/src/buildtool/execution_api/remote/bazel/bazel_network.hpp b/src/buildtool/execution_api/remote/bazel/bazel_network.hpp index b990b324..0b141845 100644 --- a/src/buildtool/execution_api/remote/bazel/bazel_network.hpp +++ b/src/buildtool/execution_api/remote/bazel/bazel_network.hpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "gsl/gsl" @@ -51,8 +52,9 @@ class BazelNetwork { [[nodiscard]] auto IsAvailable( bazel_re::Digest const& digest) const noexcept -> bool; - [[nodiscard]] auto IsAvailable(std::vector const& digests) - const noexcept -> std::vector; + [[nodiscard]] auto IsAvailable( + std::unordered_set const& digests) const noexcept + -> std::unordered_set; [[nodiscard]] auto SplitBlob(bazel_re::Digest const& blob_digest) const noexcept -> std::optional>; -- cgit v1.2.3