diff options
Diffstat (limited to 'src')
6 files changed, 35 insertions, 36 deletions
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<ArtifactDigest> const& digests) const noexcept -> std::vector<ArtifactDigest> { - std::vector<bazel_re::Digest> bazel_digests; - bazel_digests.reserve(digests.size()); - std::unordered_map<bazel_re::Digest, ArtifactDigest const*> 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<ArtifactDigest> 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<bazel_re::Digest, ArtifactDigest>::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<ArtifactDigest> 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<bazel_re::Digest> const& digests) const noexcept - -> std::vector<bazel_re::Digest> { + std::unordered_set<bazel_re::Digest> const& digests) const noexcept + -> std::unordered_set<bazel_re::Digest> { return FindMissingBlobs(instance_name, digests.begin(), digests.end()); } auto BazelCasClient::FindMissingBlobs(std::string const& instance_name, BazelBlobContainer const& blob_container) - const noexcept -> std::vector<bazel_re::Digest> { + const noexcept -> std::unordered_set<bazel_re::Digest> { auto digests_range = blob_container.Digests(); return FindMissingBlobs( instance_name, digests_range.begin(), digests_range.end()); @@ -430,8 +430,8 @@ template <class TForwardIter> auto BazelCasClient::FindMissingBlobs(std::string const& instance_name, TForwardIter const& start, TForwardIter const& end) const noexcept - -> std::vector<bazel_re::Digest> { - std::vector<bazel_re::Digest> result; + -> std::unordered_set<bazel_re::Digest> { + std::unordered_set<bazel_re::Digest> result; if (start == end) { return result; } @@ -461,7 +461,7 @@ auto BazelCasClient::FindMissingBlobs(std::string const& instance_name, auto batch = ProcessResponseContents<bazel_re::Digest>(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 <memory> #include <optional> #include <string> +#include <unordered_set> #include <vector> #include <grpcpp/support/status.h> @@ -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<bazel_re::Digest> const& digests) const noexcept - -> std::vector<bazel_re::Digest>; + std::unordered_set<bazel_re::Digest> const& digests) const noexcept + -> std::unordered_set<bazel_re::Digest>; /// \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<bazel_re::Digest>; + -> std::unordered_set<bazel_re::Digest>; /// \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<bazel_re::Digest>; + -> std::unordered_set<bazel_re::Digest>; template <typename TRequest, typename TForwardIter> [[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 <algorithm> +#include <functional> #include <iterator> -#include <unordered_map> #include <utility> #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<bazel_re::Digest>{digest}) - .empty(); + return cas_->FindMissingBlobs(instance_name_, {digest}).empty(); } -auto BazelNetwork::IsAvailable(std::vector<bazel_re::Digest> const& digests) - const noexcept -> std::vector<bazel_re::Digest> { +auto BazelNetwork::IsAvailable( + std::unordered_set<bazel_re::Digest> const& digests) const noexcept + -> std::unordered_set<bazel_re::Digest> { 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 <memory> #include <optional> #include <string> +#include <unordered_set> #include <vector> #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<bazel_re::Digest> const& digests) - const noexcept -> std::vector<bazel_re::Digest>; + [[nodiscard]] auto IsAvailable( + std::unordered_set<bazel_re::Digest> const& digests) const noexcept + -> std::unordered_set<bazel_re::Digest>; [[nodiscard]] auto SplitBlob(bazel_re::Digest const& blob_digest) const noexcept -> std::optional<std::vector<bazel_re::Digest>>; |