summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/execution_api/remote/TARGETS1
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.cpp27
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp12
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_cas_client.hpp9
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_network.cpp16
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_network.hpp6
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>>;