summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.cpp43
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_api.hpp8
2 files changed, 48 insertions, 3 deletions
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
index 1ce65259..6fbd19f3 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_api.cpp
@@ -357,7 +357,6 @@ auto BazelApi::CreateAction(
blob_digests, api, network_, missing_artifacts_info->back_map);
}
-/// NOLINTNEXTLINE(misc-no-recursion)
[[nodiscard]] auto BazelApi::ParallelRetrieveToCas(
std::vector<Artifact::ObjectInfo> const& artifacts_info,
IExecutionApi const& api,
@@ -367,6 +366,33 @@ auto BazelApi::CreateAction(
if (this == &api) {
return true;
}
+ std::unordered_set<Artifact::ObjectInfo> done{};
+ return ParallelRetrieveToCasWithCache(
+ artifacts_info, api, jobs, use_blob_splitting, &done);
+}
+
+/// NOLINTNEXTLINE(misc-no-recursion)
+[[nodiscard]] auto BazelApi::ParallelRetrieveToCasWithCache(
+ std::vector<Artifact::ObjectInfo> const& all_artifacts_info,
+ IExecutionApi const& api,
+ std::size_t jobs,
+ bool use_blob_splitting,
+ gsl::not_null<std::unordered_set<Artifact::ObjectInfo>*> done)
+ const noexcept -> bool {
+
+ std::vector<Artifact::ObjectInfo> artifacts_info{};
+ artifacts_info.reserve(all_artifacts_info.size());
+ for (auto const& info : all_artifacts_info) {
+ if (not done->contains(info)) {
+ artifacts_info.emplace_back(info);
+ }
+ }
+ if (artifacts_info.empty()) {
+ return true; // Nothing to do
+ }
+ std::sort(artifacts_info.begin(), artifacts_info.end());
+ auto last_info = std::unique(artifacts_info.begin(), artifacts_info.end());
+ artifacts_info.erase(last_info, artifacts_info.end());
// Determine missing artifacts in other CAS.
auto missing_artifacts_info = GetMissingArtifactsInfo<Artifact::ObjectInfo>(
@@ -392,8 +418,8 @@ auto BazelApi::CreateAction(
auto const result = reader.ReadDirectTreeEntries(
info.digest, std::filesystem::path{});
if (not result or
- not ParallelRetrieveToCas(
- result->infos, api, jobs, use_blob_splitting)) {
+ not ParallelRetrieveToCasWithCache(
+ result->infos, api, jobs, use_blob_splitting, done)) {
return false;
}
}
@@ -425,6 +451,17 @@ auto BazelApi::CreateAction(
return false;
}
+ try {
+ for (auto const& info : artifacts_info) {
+ done->insert(info);
+ }
+ } catch (std::exception const& ex) {
+ Logger::Log(LogLevel::Warning,
+ "Exception when updating set of synchronized objects "
+ "(continuing anyway): {}",
+ ex.what());
+ }
+
return not failure;
}
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
index c9771ed7..8a0ddcf9 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_api.hpp
@@ -114,6 +114,14 @@ class BazelApi final : public IExecutionApi {
private:
std::shared_ptr<BazelNetwork> network_;
+
+ [[nodiscard]] auto ParallelRetrieveToCasWithCache(
+ std::vector<Artifact::ObjectInfo> const& all_artifacts_info,
+ IExecutionApi const& api,
+ std::size_t jobs,
+ bool use_blob_splitting,
+ gsl::not_null<std::unordered_set<Artifact::ObjectInfo>*> done)
+ const noexcept -> bool;
};
#endif // INCLUDED_SRC_BUILDTOOL_EXECUTION_API_REMOTE_BAZEL_BAZEL_API_HPP