summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/execution_api/common/execution_api.hpp4
-rw-r--r--src/buildtool/execution_api/local/local_api.hpp11
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.cpp22
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.hpp3
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_network.cpp5
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_network.hpp3
6 files changed, 47 insertions, 1 deletions
diff --git a/src/buildtool/execution_api/common/execution_api.hpp b/src/buildtool/execution_api/common/execution_api.hpp
index 3f1da5b8..816b5031 100644
--- a/src/buildtool/execution_api/common/execution_api.hpp
+++ b/src/buildtool/execution_api/common/execution_api.hpp
@@ -73,6 +73,10 @@ class IExecutionApi {
[[nodiscard]] virtual auto IsAvailable(
ArtifactDigest const& digest) const noexcept -> bool = 0;
+
+ [[nodiscard]] virtual auto IsAvailable(
+ std::vector<ArtifactDigest> const& digests) const noexcept
+ -> std::vector<ArtifactDigest> = 0;
};
#endif // INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_EXECUTION_APIHPP
diff --git a/src/buildtool/execution_api/local/local_api.hpp b/src/buildtool/execution_api/local/local_api.hpp
index 20886e5a..72b7e28c 100644
--- a/src/buildtool/execution_api/local/local_api.hpp
+++ b/src/buildtool/execution_api/local/local_api.hpp
@@ -150,6 +150,17 @@ class LocalApi final : public IExecutionApi {
return storage_->BlobPath(digest, false).has_value();
}
+ [[nodiscard]] auto IsAvailable(std::vector<ArtifactDigest> const& digests)
+ const noexcept -> std::vector<ArtifactDigest> final {
+ std::vector<ArtifactDigest> result;
+ for (auto const& digest : digests) {
+ if (not storage_->BlobPath(digest, false).has_value()) {
+ result.push_back(digest);
+ }
+ }
+ return result;
+ }
+
private:
std::shared_ptr<LocalTreeMap> tree_map_{std::make_shared<LocalTreeMap>()};
std::shared_ptr<LocalStorage> storage_{
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
index ca5d4946..51e85176 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
@@ -170,7 +170,7 @@ auto BazelApi::CreateAction(
return std::nullopt;
}
if (tree_map_->AddTree(*digest, std::move(tree))) {
- return ArtifactDigest{std::move(*digest)};
+ return ArtifactDigest{*digest};
}
return std::nullopt;
}
@@ -179,3 +179,23 @@ auto BazelApi::CreateAction(
ArtifactDigest const& digest) const noexcept -> bool {
return network_->IsAvailable(digest);
}
+
+[[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::transform(digests.begin(),
+ digests.end(),
+ std::back_inserter(bazel_digests),
+ [](ArtifactDigest const& digest) { return digest; });
+ auto bazel_result = network_->IsAvailable(bazel_digests);
+ std::vector<ArtifactDigest> result;
+ result.reserve(bazel_result.size());
+ std::transform(
+ bazel_result.begin(),
+ bazel_result.end(),
+ std::back_inserter(result),
+ [](bazel_re::Digest& digest) { return ArtifactDigest{digest}; });
+ return result;
+}
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
index 8582db65..f953618e 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
@@ -57,6 +57,9 @@ class BazelApi final : public IExecutionApi {
[[nodiscard]] auto IsAvailable(ArtifactDigest const& digest) const noexcept
-> bool final;
+ [[nodiscard]] auto IsAvailable(std::vector<ArtifactDigest> const& digests)
+ const noexcept -> std::vector<ArtifactDigest> final;
+
private:
std::shared_ptr<BazelNetwork> network_;
std::shared_ptr<LocalTreeMap> tree_map_;
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_network.cpp b/src/buildtool/execution_api/remote/bazel/bazel_network.cpp
index 669f93dd..b1ef59c8 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_network.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_network.cpp
@@ -70,6 +70,11 @@ auto BazelNetwork::IsAvailable(bazel_re::Digest const& digest) const noexcept
.empty();
}
+auto BazelNetwork::IsAvailable(std::vector<bazel_re::Digest> const& digests)
+ const noexcept -> std::vector<bazel_re::Digest> {
+ return cas_->FindMissingBlobs(instance_name_, digests);
+}
+
template <class T_Iter>
auto BazelNetwork::DoUploadBlobs(T_Iter const& first,
T_Iter const& last) noexcept -> bool {
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_network.hpp b/src/buildtool/execution_api/remote/bazel/bazel_network.hpp
index 644af2b4..13a5bcf7 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_network.hpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_network.hpp
@@ -54,6 +54,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>;
+
/// \brief Uploads blobs to CAS
/// \param blobs The blobs to upload
/// \param skip_find_missing Skip finding missing blobs, just upload all